94 #include "TGeoManager.h" 102 #ifndef FeatureVertexFinder_H 103 #define FeatureVertexFinder_H 139 void MergeAndSort3dVtxCandidate(std::vector<double> merge_vtxX, std::vector<double> merge_vtxY, std::vector<double> merge_vtxZ, std::vector<double> merge_vtxStgth);
172 std::vector<std::vector<int> >
Cls;
198 #endif // FeatureVertexFinder_H 218 produces< std::vector<recob::Vertex> >();
219 produces< std::vector<recob::EndPoint2D> >();
220 produces< art::Assns<recob::EndPoint2D, recob::Hit> >();
224 produces< art::Assns<recob::Vertex, recob::Hit> >();
225 produces< art::Assns<recob::Vertex, recob::Shower> >();
226 produces< art::Assns<recob::Vertex, recob::Track> >();
229 Cls.resize(geom->Nplanes(),std::vector<int>());
279 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
284 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
290 if(GT2PlaneDetector){std::cout<<
"yeah"<<std::endl;}
295 std::unique_ptr<std::vector<recob::Vertex> > vcol(
new std::vector<recob::Vertex>);
296 std::unique_ptr<std::vector<recob::EndPoint2D> > epcol(
new std::vector<recob::EndPoint2D>);
314 std::vector< art::Ptr<recob::EndPoint2D> > ccrawlerEndPoints;
327 {
mf::LogWarning(
"FeatureVertexFinder") <<
"Failed to get EndPoint2d's from Cluster Crawler";}
338 std::vector< art::Ptr<recob::EndPoint2D> > cornerEndPoints;
353 {
mf::LogWarning(
"FeatureVertexFinder") <<
"Failed to get EndPoint2d's from Corner Finder";}
380 for (
unsigned int ii = 0; ii < clusterListHandle->size(); ++ii){
402 {
mf::LogWarning(
"FeatureVertexFinder") <<
"Failed to get Cluster from default cluster module";}
445 if(tempxyz[0] == 0 && tempxyz[1] == 0 && tempxyz[2] == 0){
continue;}
447 vcol->push_back(the3Dvertex);
455 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
458 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
468 if(temp2dXYZ[0] == 0 && temp2dXYZ[1] == 0 && temp2dXYZ[2] == 0){
continue;}
473 double EndPoint2d_TimeTick = detprop->
ConvertXToTicks(temp2dXYZ[0],plane, tpc, cstat);
474 int EndPoint2d_Wire = 0;
475 int EndPoint2d_Channel = 0;
478 {EndPoint2d_Wire = geom->
NearestWire(temp2dXYZ , plane, tpc, cstat);}
484 {EndPoint2d_Channel = geom->
NearestChannel(temp2dXYZ, plane, tpc, cstat);}
491 geo::WireID wireID(cstat,tpc,plane,EndPoint2d_Wire);
529 if(bail > 0){
continue;}
530 if(tempxyz[0] == 0 && tempxyz[1] == 0 && tempxyz[2] == 0){
continue;}
534 vcol->push_back(the3Dvertex);
546 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
549 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
560 double EndPoint2d_TimeTick = detprop->
ConvertXToTicks(temp2dXYZ[0],plane, tpc, cstat);
561 int EndPoint2d_Wire = 0;
562 int EndPoint2d_Channel = 0;
565 {EndPoint2d_Wire = geom->
NearestWire(temp2dXYZ , plane, tpc, cstat);}
571 {EndPoint2d_Channel = geom->
NearestChannel(temp2dXYZ, plane, tpc, cstat);}
578 geo::WireID wireID(cstat,tpc,plane,EndPoint2d_Wire);
596 mf::LogVerbatim(
"Summary") << std::setfill(
'-') << std::setw(175) <<
"-" << std::setfill(
' ');
598 for(
size_t i = 0; i<epcol->size(); ++i)
mf::LogVerbatim(
"Summary") << epcol->at(i) ;
599 for(
size_t i = 0; i<vcol->size(); ++i)
mf::LogVerbatim(
"Summary") << vcol->at(i) ;
609 evt.
put(std::move(epcol));
610 evt.
put(std::move(vcol));
611 evt.
put(std::move(assnep));
612 evt.
put(std::move(assntr));
613 evt.
put(std::move(assnsh));
614 evt.
put(std::move(assnh));
674 double y = 0.,
z = 0.;
675 double yy = 0.,
zz = 0.;
676 double yy2 = 0., zz2 = 0.;
677 double yy3 = 0., zz3 = 0.;
681 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
686 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
691 for(
size_t endpt1 = 0; endpt1 < EndPoints.size(); endpt1++)
696 for(
size_t endpt2 = endpt1+1; endpt2 < EndPoints.size(); endpt2++)
701 if(EndPoints.at(endpt1)->WireID().Plane != EndPoints.at(endpt2)->WireID().Plane)
706 float tempXFeature1 = detprop->
ConvertTicksToX(EndPoints.at(endpt1)->DriftTime(), EndPoints.at(endpt1)->WireID().Plane, tpc, cstat);
707 float tempXFeature2 = detprop->
ConvertTicksToX(EndPoints.at(endpt2)->DriftTime(), EndPoints.at(endpt2)->WireID().Plane, tpc, cstat);
713 geom->
PlaneWireToChannel(EndPoints.at(endpt1)->WireID().Plane, EndPoints.at(endpt1)->WireID().Wire, tpc, cstat),
715 std::abs(tempXFeature1 - tempXFeature2) < 0.5)
725 candidate_strength.push_back(EndPoints.at(endpt1)->Strength() + EndPoints.at(endpt2)->Strength());
736 for(
size_t endpt3 = endpt2+1; endpt3 < EndPoints.size(); endpt3++)
741 if(EndPoints.at(endpt3)->WireID().Plane != EndPoints.at(endpt2)->WireID().Plane &&
742 EndPoints.at(endpt3)->WireID().Plane != EndPoints.at(endpt1)->WireID().Plane &&
743 EndPoints.at(endpt1)->WireID().Plane != EndPoints.at(endpt2)->WireID().Plane )
745 float tempXFeature3 = detprop->
ConvertTicksToX(EndPoints.at(endpt3)->DriftTime(), EndPoints.at(endpt3)->WireID().Plane, tpc, cstat);
751 geom->
PlaneWireToChannel(EndPoints.at(endpt1)->WireID().Plane, EndPoints.at(endpt1)->WireID().Wire, tpc, cstat),
754 geom->
PlaneWireToChannel(EndPoints.at(endpt2)->WireID().Plane, EndPoints.at(endpt2)->WireID().Wire, tpc, cstat),
757 geom->
PlaneWireToChannel(EndPoints.at(endpt1)->WireID().Plane, EndPoints.at(endpt1)->WireID().Wire, tpc, cstat),
759 std::abs(tempXFeature3 - tempXFeature2) < 1.0 && std::abs(tempXFeature3 - tempXFeature1) < 1.0 &&
760 std::abs(tempXFeature1 - tempXFeature2) < 1.0 )
762 candidate_x.push_back(detprop->
ConvertTicksToX(EndPoints.at(endpt1)->DriftTime(), EndPoints.at(endpt1)->WireID().Plane, tpc, cstat));
767 geom->
IntersectionPoint(EndPoints.at(endpt1)->WireID().Wire, EndPoints.at(endpt2)->WireID().Wire,
768 EndPoints.at(endpt1)->WireID().Plane, EndPoints.at(endpt2)->WireID().Plane, cstat, tpc,
y,
z);
772 candidate_strength.push_back(EndPoints.at(endpt1)->Strength()+EndPoints.at(endpt2)->Strength()+EndPoints.at(endpt3)->Strength());
776 if(endpt1 < EndPoints.size())
778 if(endpt2 < EndPoints.size())
780 if(endpt3 < EndPoints.size())
819 int nClustersFound = 0;
822 for(
auto& c :
Cls) c.clear();
824 for(
size_t iclu = 0; iclu < RawClusters.
size(); ++iclu)
827 std::vector< art::Ptr<recob::Hit> >
hit = fmhit.at(iclu);
830 if(hit.size() < 15){
continue;}
836 if(view >= Cls.size()) {
837 std::cerr << __PRETTY_FUNCTION__
838 <<
"\033[93m Logic error in my code ... view " << view <<
" not supported ! \033[00m" 843 Cls.at(RawClusters.
at(iclu)->View()).push_back(iclu);
863 std::vector<double> wires;
864 std::vector<double> times;
871 for(
size_t i = 0; i < hit.size(); ++i)
873 wires.push_back(hit[i]->WireID().Wire);
874 times.push_back(hit[i]->PeakTime());
886 TGraph *the2Dtrack =
new TGraph(n,&wires[0],×[0]);
890 the2Dtrack->Fit(
"pol1",
"Q");
891 TF1 *pol1=(TF1*) the2Dtrack->GetFunction(
"pol1");
894 pol1->GetParameters(par);
895 parerror[1] = pol1->GetParError(1);
896 double FitChi2 = pol1->GetChisquare();
897 double FitNDF = pol1->GetNDF();
899 double fitGoodness = FitChi2/FitNDF;
904 if( fitGoodness > 10)
906 dtdwstart.push_back(std::tan(RawClusters[iclu]->StartAngle()));
922 mf::LogWarning(
"FeatureVertexFinder") <<
"Fitter failed, using the clusters default dTdW()";
924 dtdwstart.push_back(std::tan(RawClusters[iclu]->StartAngle()));
934 else {
dtdwstart.push_back(std::tan(RawClusters[iclu]->StartAngle()));}
949 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
954 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
964 if (Cls[i].size() >= 1)
969 for (
unsigned int j = 0; j<Cls[i].size(); ++j)
972 Clu_Plane.push_back(RawClusters.
at(Cls.at(i).at(j))->View());
981 Clu_Length.push_back(std::sqrt(pow((RawClusters.
at(Cls.at(i).at(j))->StartWire()-RawClusters.
at(Cls.at(i).at(j))->EndWire())*13.5,2) +
982 pow(RawClusters.
at(Cls.at(i).at(j))->StartTick()-RawClusters.
at(Cls.at(i).at(j))->EndTick(),2)));
987 Clu_Yintercept.push_back(RawClusters.
at(Cls.at(i).at(j))->StartTick() - (
dtdwstart[Cls[i][j]] * RawClusters.
at(Cls.at(i).at(j))->StartWire()));
993 Clu_Yintercept2.push_back(RawClusters.
at(Cls.at(i).at(j))->EndTick() - (
dtdwstart[Cls[i][j]] * RawClusters.
at(Cls.at(i).at(j))->EndWire()));
1021 for(
unsigned int n = nClustersFound;
n > 0;
n--)
1027 for (
unsigned int m = 0; m <
n; m++)
1052 if(intersection_X2 < 1){intersection_X2 = -999;}
1053 if(intersection_X2 > geom->
Nwires(
Clu_Plane[m],0,0)){intersection_X2 = -999;}
1054 if(intersection_Y2 < 0){intersection_Y2 = -999;}
1056 if(intersection_X < 1){intersection_X = -999;}
1057 if(intersection_X > geom->
Nwires(
Clu_Plane[m],0,0)){intersection_X = -999;}
1058 if(intersection_Y < 0){intersection_Y = -999;}
1067 std::vector< art::Ptr<recob::Hit> > hitClu1 = fmhit.at(m);
1068 std::vector< art::Ptr<recob::Hit> > hitClu2 = fmhit.at(n);
1073 if((abs(
Clu_EndPos_Wire[m] - intersection_X2 ) > 80 && hitClu1.size() < 8) ||
1074 (abs(
Clu_EndPos_Wire[n] - intersection_X2 ) > 80 && hitClu2.size() < 8) )
1075 {intersection_X2 = -999;intersection_Y2 = -999;}
1079 {intersection_X = -999;intersection_Y = -999;}
1084 if((abs(
Clu_EndPos_Wire[m] - intersection_X2 ) > 50 && hitClu1.size() < 4) ||
1085 (abs(
Clu_EndPos_Wire[n] - intersection_X2 ) > 50 && hitClu2.size() < 4) )
1086 {intersection_X2 = -999;intersection_Y2 = -999;}
1090 {intersection_X = -999;intersection_Y = -999;}
1095 mf::LogWarning(
"FeatureVertexFinder") <<
"FindManyHit Function faild";
1096 intersection_X = -999;intersection_Y = -999;
1097 intersection_X2 = -999;intersection_Y2 = -999;
1104 if( intersection_X2 > 1 && intersection_Y2 > 0 &&
1105 ( intersection_X2 < geom->Nwires(
Clu_Plane[m],0,0) ) &&
1106 ( intersection_Y2 < detprop->NumberTimeSamples() ) )
1117 if( intersection_X > 1 && intersection_Y > 0 &&
1118 ( intersection_X < geom->Nwires(
Clu_Plane[m],0,0) ) &&
1119 ( intersection_Y < detprop->NumberTimeSamples() ) )
1152 std::vector<double> vtx_wire_merged;
1153 std::vector<double> vtx_time_merged;
1154 std::vector<double> vtx_plane_merged;
1156 double y_coord = 0, z_coord = 0;
1158 bool merged =
false;
1175 for(
size_t vtxloop1 = 0 ; vtxloop1 < Wire_2dvtx.size(); vtxloop1++)
1177 if(Wire_2dvtx[vtxloop1] < 0){
continue;}
1183 for(
size_t vtxloop2 = vtxloop1+1; vtxloop2 < Wire_2dvtx.size(); vtxloop2++)
1185 if(Wire_2dvtx[vtxloop2] < 0){
continue;}
1190 if(Plane_2dvtx[vtxloop1] == Plane_2dvtx[vtxloop2])
1196 if( fabs(Wire_2dvtx[vtxloop1] - Wire_2dvtx[vtxloop2]) < 4 )
1201 if( fabs(Time_2dvtx[vtxloop1] - Time_2dvtx[vtxloop2]) < 10 )
1203 vtx_wire_merged.push_back( ((Wire_2dvtx[vtxloop2] + Wire_2dvtx[vtxloop1])/ 2) );
1204 vtx_time_merged.push_back( ((Time_2dvtx[vtxloop2] + Time_2dvtx[vtxloop1])/ 2) ) ;
1205 vtx_plane_merged.push_back( Plane_2dvtx[vtxloop1] );
1208 if(vtxloop2<Wire_2dvtx.size()){vtxloop2++;}
1209 if(vtxloop1<Wire_2dvtx.size()){vtxloop1++;}
1216 vtx_wire_merged.push_back( Wire_2dvtx[vtxloop1] );
1217 vtx_time_merged.push_back( Time_2dvtx[vtxloop1] );
1218 vtx_plane_merged.push_back( Plane_2dvtx[vtxloop1] );
1225 uint32_t vtx1_channel = 0;
1226 uint32_t vtx2_channel = 0;
1235 for(
size_t cstat = 0; cstat < geom->
Ncryostats(); ++cstat)
1240 for(
size_t tpc = 0; tpc < geom->
Cryostat(cstat).
NTPC(); ++tpc)
1242 for(
unsigned int vtx = vtx_wire_merged.size(); vtx > 0; vtx--)
1244 for (
unsigned int vtx1 = 0; vtx1 < vtx; vtx1++)
1249 if(vtx_plane_merged[vtx1] != vtx_plane_merged[vtx])
1257 unsigned int vtx1_plane = vtx_plane_merged[vtx1];
1258 unsigned int vtx1_wire = vtx_wire_merged[vtx1];
1262 {
mf::LogWarning(
"FeatureVertexFinder") <<
"PlaneWireToChannel Failed";
1266 unsigned int vtx2_plane = vtx_plane_merged[vtx];
1267 unsigned int vtx2_wire = vtx_wire_merged[vtx];
1271 {
mf::LogWarning(
"FeatureVertexFinder") <<
"PlaneWireToChannel Failed";
1280 {match = geom->
ChannelsIntersect( vtx1_channel, vtx2_channel, y_coord, z_coord);}
1282 {
mf::LogWarning(
"FeatureVertexFinder") <<
"match failed for some reason";
1290 float tempXCluster1 = detprop->
ConvertTicksToX(vtx_time_merged[vtx1], vtx1_plane, tpc, cstat);
1291 float tempXCluster2 = detprop->
ConvertTicksToX(vtx_time_merged[vtx], vtx2_plane, tpc, cstat);
1297 if(std::abs(tempXCluster1 - tempXCluster2) < 0.5 &&
candidate_x.size() < 101)
1330 std::vector<double> x_3dVertex_dupRemoved = {0.};
1331 std::vector<double> y_3dVertex_dupRemoved = {0.};
1332 std::vector<double> z_3dVertex_dupRemoved = {0.};
1333 std::vector<double> strength_dupRemoved = {0.};
1338 for(
size_t dup = 0; dup < merge_vtxX.size(); dup ++)
1341 float tempX_dup = merge_vtxX[dup];
1342 float tempY_dup = merge_vtxY[dup];
1343 float tempZ_dup = merge_vtxZ[dup];
1344 float tempStgth = merge_vtxStgth[dup];
1349 bool duplicate_found =
false;
1353 for(
size_t check = dup+1; check < merge_vtxX.size(); check++)
1359 if(std::abs( merge_vtxX[check] - tempX_dup ) < 0.1 && std::abs( merge_vtxY[check] - tempY_dup ) < 0.1 &&
1360 std::abs( merge_vtxZ[check] - tempZ_dup ) < 0.1 )
1361 {duplicate_found =
true;}
1369 if(!duplicate_found && tempX_dup > 0)
1371 x_3dVertex_dupRemoved.push_back(tempX_dup);
1372 y_3dVertex_dupRemoved.push_back(tempY_dup);
1373 z_3dVertex_dupRemoved.push_back(tempZ_dup);
1374 strength_dupRemoved.push_back(tempStgth);
1385 double tempX, tempY, tempZ, tempS;
1390 for(
size_t npri = 0; (npri < x_3dVertex_dupRemoved.size()) && flag; npri++)
1393 for(
size_t mpri = 0; mpri < x_3dVertex_dupRemoved.size() -1; mpri++)
1396 if(strength_dupRemoved[mpri+1] > strength_dupRemoved[mpri] ||
1397 (strength_dupRemoved[mpri+1] == strength_dupRemoved[mpri] && z_3dVertex_dupRemoved[mpri] > z_3dVertex_dupRemoved[mpri+1]) )
1399 tempX = x_3dVertex_dupRemoved[mpri];
1400 x_3dVertex_dupRemoved[mpri] = x_3dVertex_dupRemoved[mpri+1];
1401 x_3dVertex_dupRemoved[mpri+1] = tempX;
1403 tempY = y_3dVertex_dupRemoved[mpri];
1404 y_3dVertex_dupRemoved[mpri] = y_3dVertex_dupRemoved[mpri+1];
1405 y_3dVertex_dupRemoved[mpri+1] = tempY;
1407 tempZ = z_3dVertex_dupRemoved[mpri];
1408 z_3dVertex_dupRemoved[mpri] = z_3dVertex_dupRemoved[mpri+1];
1409 z_3dVertex_dupRemoved[mpri+1] = tempZ;
1411 tempS = strength_dupRemoved[mpri];
1412 strength_dupRemoved[mpri] = strength_dupRemoved[mpri+1];
1413 strength_dupRemoved[mpri+1] = tempS;
1424 for(
size_t count = 0; count < x_3dVertex_dupRemoved.size(); count++)
void produce(art::Event &evt)
std::vector< double > Clu_Plane
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
void MergeAndSort3dVtxCandidate(std::vector< double > merge_vtxX, std::vector< double > merge_vtxY, std::vector< double > merge_vtxZ, std::vector< double > merge_vtxStgth)
std::vector< double > TwoDvtx_wire
Encapsulate the construction of a single cyostat.
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
void Find3dVtxFrom2dClusterVtxCand(std::vector< double > Wire_2dvtx, std::vector< double > Time_2dvtx, std::vector< double > Plane_2dvtx)
unsigned int Nplanes() const
Number of planes in this tpc.
std::vector< double > TwoDvtx_time
Declaration of signal hit object.
std::vector< double > Clu_EndPos_Wire
std::vector< double > candidate_y
virtual ~FeatureVertexFinder()
std::vector< double > candidate_strength
std::vector< double > Clu_Length
bool ChannelsIntersect(raw::ChannelID_t c1, raw::ChannelID_t c2, double &y, double &z) const
Returns an intersection point of two channels.
std::vector< double > Clu_Yintercept
void reconfigure(fhicl::ParameterSet const &p)
std::vector< double > Clu_EndPos_TimeTick
std::vector< double > MergeSort3dVtx_strength
unsigned int Ncryostats() const
Returns the number of cryostats in the detector.
std::vector< double > candidate_z
Definition of vertex object for LArSoft.
unsigned int Nwires(unsigned int p, unsigned int tpc=0, unsigned int cstat=0) const
Returns the total number of wires in the specified plane.
virtual double ConvertXToTicks(double X, int p, int t, int c) const =0
std::vector< double > Clu_StartPos_TimeTick
void Find2dClusterVertexCandidates(art::PtrVector< recob::Cluster > RawClusters, art::FindManyP< recob::Hit > fmhit)
ProductID put(std::unique_ptr< PROD > &&product)
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
std::vector< std::vector< int > > Cls
#define DEFINE_ART_MODULE(klass)
void push_back(Ptr< U > const &p)
void Get3dVertexCandidates(std::vector< art::Ptr< recob::EndPoint2D > > EndPoints, bool PlaneDet)
std::vector< double > Clu_StartPos_Wire
T get(std::string const &key) const
std::vector< double > MergeSort3dVtx_zpos
geo::WireID::WireID_t NearestWire(geo::Point_t const &point, geo::PlaneID const &planeid) const
Returns the index of wire closest to position in the specified TPC.
std::string fClusterModuleLabel
unsigned int NTPC() const
Number of TPCs in this cryostat.
CryostatGeo const & Cryostat(geo::CryostatID const &cryoid) const
Returns the specified cryostat.
std::string fCornerFinderModuleLabel
reference at(size_type n)
std::vector< double > dtdwstart
FeatureVertexFinder(fhicl::ParameterSet const &pset)
virtual unsigned int NumberTimeSamples() const =0
Declaration of cluster object.
bool IntersectionPoint(geo::WireID const &wid1, geo::WireID const &wid2, double &y, double &z) const
Returns the intersection point of two wires.
Provides recob::Track data product.
View_t View(geo::PlaneID const &pid) const
Returns the view (wire orientation) on the channels of specified TPC plane.
Detector simulation of raw signals on wires.
std::vector< double > MergeSort3dVtx_ypos
Encapsulate the geometry of a wire.
virtual double ConvertTicksToX(double ticks, int p, int t, int c) const =0
raw::ChannelID_t PlaneWireToChannel(WireID const &wireid) const
Returns the ID of the TPC channel connected to the specified wire.
std::vector< double > MergeSort3dVtx_xpos
Utility object to perform functions of association.
Encapsulate the construction of a single detector plane.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
const TPCGeo & TPC(unsigned int itpc) const
Return the itpc'th TPC in the cryostat.
std::vector< double > Clu_Slope
std::vector< double > TwoDvtx_plane
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
std::vector< double > dtdwstartError
std::vector< double > candidate_x
std::string fCCrawlerEndPoint2dModuleLabel
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
raw::ChannelID_t NearestChannel(geo::Point_t const &worldLoc, geo::PlaneID const &planeid) const
Returns the ID of the channel nearest to the specified position.
std::string fHitModuleLabel
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Encapsulate the construction of a single detector plane.
std::vector< double > Clu_Yintercept2