00001 #ifndef TCURLFINDER_FLAG_
00002 #define TCURLFINDER_FLAG_
00003
00004 #ifdef TRKRECO_DEBUG_DETAIL
00005 #ifndef TRKRECO_DEBUG
00006 #define TRKRECO_DEBUG
00007 #endif
00008 #endif
00009 #define HEP_SHORT_NAMES
00010 #include "CLHEP/Matrix/DiagMatrix.h"
00011
00012 #include "TrkReco/TFinderBase.h"
00013 #include "TrkReco/TBuilderCurl.h"
00014 #include "TrkReco/TMSelector.h"
00015 #include "TrkReco/TCurlFinderParameters.h"
00016
00017 using CLHEP::HepDiagMatrix;
00018
00019 class TMDCWire;
00020 class TMLink;
00021 class TTrack;
00022 class TMDCWireHit;
00023 class TCircle;
00024 class TSegmentCurl;
00025
00026 class TCurlFinder : public TFinderBase {
00027
00028 public:
00029 TCurlFinder(void);
00030 ~TCurlFinder(void);
00031 std::string name(void) const;
00032 std::string version(void) const;
00033
00034 TCurlFinder(const unsigned min_segment,
00035 const unsigned min_salvage,
00036 const double bad_distance_for_salvage,
00037 const double good_distance_for_salvage,
00038 const unsigned min_sequence,
00039 const unsigned min_fullwire,
00040 const double range_for_axial_search,
00041 const double range_for_stereo_search,
00042 const unsigned superlayer_for_stereo_search,
00043 const double range_for_axial_last2d_search,
00044 const double range_for_stereo_last2d_search,
00045 const double trace2d_distance,
00046 const double trace2d_first_distance,
00047 const double trace3d_distance,
00048 const unsigned determine_one_track,
00049 const double selector_max_impact,
00050 const double selector_max_sigma,
00051 const double selector_strange_pz,
00052 const double selector_replace_dz,
00053 const unsigned stereo_2dfind,
00054 const unsigned merge_exe,
00055 const double merge_ratio,
00056 const double merge_z_diff,
00057 const double mask_distance,
00058 const double ratio_used_wire,
00059 const double range_for_stereo1,
00060 const double range_for_stereo2,
00061 const double range_for_stereo3,
00062 const double range_for_stereo4,
00063 const double range_for_stereo5,
00064 const double range_for_stereo6,
00065 const double z_cut,
00066 const double z_diff_for_last_attend,
00067 const unsigned svd_reconstruction,
00068 const double min_svd_electrons,
00069 const unsigned on_correction,
00070 const unsigned output_2dtracks,
00071 const unsigned curl_version,
00072
00073 const double minimum_seedLength,
00074 const double minimum_2DTrackLength,
00075 const double minimum_3DTrackLength,
00076 const double minimum_closeHitsLength,
00077 const double MIN_RADIUS_OF_STRANGE_TRACK,
00078 const double ULTIMATE_MIN_RADIUS_OF_STRANGE_TRACK);
00079
00080
00082 int doit(const AList<TMDCWireHit> & axialHits,
00083 const AList<TMDCWireHit> & stereoHits,
00084 AList<TTrack> & tracks,
00085 AList<TTrack> & tracks2D);
00086
00088 void clear(void);
00089
00090 private:
00091 IMagneticFieldSvc* m_pmgnIMF;
00093 double distance(const double, const double) const;
00094 unsigned offset(const unsigned) const;
00095 unsigned layerId(const double &) const;
00096 unsigned maxLocalLayerId(const unsigned) const;
00097 int nextSuperAxialLayerId(const unsigned, const int) const;
00098 int nextSuperStereoLayerId(const unsigned, const int) const;
00099 void makeList(AList<TMLink>&, const AList<TSegmentCurl>&, const AList<TMLink>&);
00100 void makeList(AList<TMLink>&, const AList<TMLink>&, const AList<TMLink>&);
00101 unsigned nAxialHits(const double&) const;
00102
00104 void makeWireHitsListsSegments(const AList<TMDCWireHit>&, const AList<TMDCWireHit>&);
00105
00107 int checkSortSegments(void);
00108
00110 void makeCurlTracks(AList<TTrack> &tracks,
00111 AList<TTrack> &tracks2D);
00112
00114 void linkNeighboringWires(AList<TMLink>*, const unsigned);
00115 void setNeighboringWires(TMLink*, const TMLink*);
00116 void createSuperLayer(void);
00117 void createSegments(AList<TMLink>&);
00118 void searchSegment(TMLink*, AList<TMLink>&, AList<TMLink>&, TSegmentCurl*);
00119 TMLink * findLink(const TMLink*, const AList<TMLink>&);
00120
00122 void checkExceptionalSegmentsType01(void);
00123 void checkExceptionalSegmentsType02(void);
00124 void checkExceptionalSegmentsType03(void);
00125
00128 TTrack * make3DTrack(const TCircle*);
00129 TTrack * make3DTrack(const TCircle*, AList<TSegmentCurl>&);
00130 void findCloseHits(AList<TMLink>&, TTrack&, AList<TMLink>&);
00131 void salvage3DTrack(TTrack*, bool = true);
00132 TTrack* merge3DTrack(TTrack*, AList<TTrack>&);
00133 bool check3DTrack(TTrack*);
00134 int trace3DTrack(TTrack*);
00135 void mask3DTrack(TTrack*, AList<TMLink>&);
00136 void assignTracks(void);
00137 void checkRelation(AList<TTrack>&);
00138 void check2DTracks(void);
00139
00141 TCircle * make2DTrack(const AList<TMLink>&, const AList<TSegmentCurl>&, const unsigned);
00142 void searchAxialCand(AList<TMLink>&, const AList<TMLink>&, const TCircle*,
00143 const int, const unsigned, const double);
00144 void searchStereoCand(AList<TMLink>&, const AList<TMLink>&, const TCircle*,
00145 const int, const unsigned, const double);
00146 unsigned searchHits(const TMLink*, const TCircle*, const double) const;
00147 unsigned searchHits(AList<TMLink>&, const AList<TMLink>&, const TCircle*, const double) const;
00148 unsigned checkAppendHits(const AList<TMLink>&, AList<TMLink>&) const;
00149 double distance(const TTrack&, const TMLink&) const;
00150 int trace2DTrack(TCircle*);
00151 bool check2DCircle(TCircle*);
00152 TCircle * dividing2DTrack(TCircle*);
00153 bool fitWDD(TCircle&,double&,int&) const;
00154 void removeStereo(TCircle&) const;
00155
00157 int makeWithMC(const AList<TMDCWireHit>&, const AList<TMDCWireHit>&,AList<TTrack>&);
00158
00160 void makeCdcFrame(void);
00161 void plotSegment(const AList<TMLink>&, const int flag = 1);
00162 void plotCircle(const TCircle&, const int flag = 1);
00163 void plotTrack(const TTrack&, const int flag = 1);
00164 void writeSegment(const AList<TMLink>&, const int type = 0);
00165
00167 void dumpType1(TTrack*);
00168 void dumpType2(TTrack*);
00169
00170 AList<TMLink> m_unusedAxialHitsOriginal;
00171 AList<TMLink> m_unusedAxialHits;
00172 AList<TMLink> m_allAxialHitsOriginal;
00173
00174 AList<TMLink> m_unusedStereoHitsOriginal;
00175 AList<TMLink> m_unusedStereoHits;
00176 AList<TMLink> m_allStereoHitsOriginal;
00177
00178 AList<TMLink> m_removedHits;
00179
00180 AList<TCircle> m_circles;
00181 AList<TCircle> m_allCircles;
00182 AList<TTrack> m_tracks;
00183 AList<TTrack> m_allTracks;
00184 AList<TTrack> m_svdTracks;
00185 AList<TTrack> m_2dTracks;
00186
00187 AList<TMDCWireHit> m_hitsOnInnerSuperLayer;
00188
00189
00190 AList<TMLink> m_unusedAxialHitsOnEachLayer[19];
00191 AList<TMLink> m_unusedStereoHitsOnEachLayer[24];
00192 AList<TMLink> m_unusedAxialHitsOnEachSuperLayer[5];
00193 AList<TMLink> m_unusedStereoHitsOnEachSuperLayer[6];
00194 AList<TSegmentCurl> m_segmentList;
00195
00196 TCurlFinderParameter m_param;
00197
00198 TBuilderCurl m_builder;
00199 TMSelector m_trackSelector;
00200
00201 THelixFitter m_fitter;
00202
00203
00204 void debugCheckSegments0(void);
00205 void debugCheckSegments1(void);
00206 void debugCheckSegments2(void);
00207 void debugCheckSegments(const double localId, const double layerId,
00208 const double localId2,const double layerId2);
00209
00210 bool m_debugCdcFrame;
00211 int m_debugPlotFlag;
00212 int m_debugFileNumber;
00213 };
00214
00215 #endif