678{
680
683 std::list<ODRESULT> listODResults;
684 listODResults.clear();
685 Float_t fRecPosX = -9999.0;
686 Float_t fRecPosY = -9999.0;
687
688 std::map<string, int> mapRecoMethods;
689 mapRecoMethods.clear();
690 mapRecoMethods.insert(std::pair<string, int>("ODTracking", 1));
691 mapRecoMethods.insert(std::pair<string, int>("MDTracking", 2));
692 mapRecoMethods.insert(std::pair<string, int>("MDOverlap", 3));
693 mapRecoMethods.insert(std::pair<string, int>("CenterGravity", 4));
694 mapRecoMethods.insert(std::pair<string, int>("MDMultiple", 5));
695 mapRecoMethods.insert(std::pair<string, int>("HalfReco", 6));
696 mapRecoMethods.insert(std::pair<string, int>("MDGap", 7));
697 mapRecoMethods.insert(std::pair<string, int>("EdgeMethod", 8));
698
699 std::vector<int> vecFibSel;
700 vecFibSel.clear();
701
702 switch(mapRecoMethods[strAlgo])
703 {
704 case 1:
705 {
706 ALFA_ODTracking* pODTracking = new ALFA_ODTracking();
707
711
712 std::list<ODRESULT>::const_iterator
iter;
713 for(iter=listODResults.begin(); iter!=listODResults.end(); ++iter)
714 {
715 ODResults.
iSide = (*iter).iSide;
716 ODResults.
fRecPos = (*iter).fRecPos;
717 ODResults.
fOverY = (*iter).fOverY;
718 ODResults.
iNumY = (*iter).iNumY;
719
720 if ((ODResults.
fRecPos != -9999.0))
721 {
723 std::fill_n(&iFibSel[0][0], sizeof(iFibSel)/sizeof(Int_t), -9999);
724
726 vecFibSel.clear();
728 {
729 vecFibSel.push_back(iFibSel[ODResults.
iSide][iPlate]);
730 }
731
733 }
734 }
735
736 delete pODTracking;
737 break;
738 }
739 case 2:
740 {
741 ALFA_MDTracking* pMDTracking = new ALFA_MDTracking();
743 sc = pMDTracking->
Execute(eRPName-1, ListMDHits);
744 sc = pMDTracking->
Finalize(fRecPosX, fRecPosY);
745
746 if (fRecPosX!=-9999.0 && fRecPosY!=-9999.0)
747 {
749 Int_t iNumU = 0, iNumV = 0;
750 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
751 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
752
753 pMDTracking->
GetData(iNumU, iNumV, fOverlapU, fOverlapV, iFibSel);
754 vecFibSel.clear();
755 for (int & iLayer : iFibSel)
756 {
757 vecFibSel.push_back(iLayer);
758 }
759
760 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(2, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
761 }
762
763 delete pMDTracking;
764 break;
765 }
766 case 3:
767 {
768 ALFA_MDOverlap* pMDOverlap = new ALFA_MDOverlap();
769
772 sc = pMDOverlap->
Finalize(fRecPosX, fRecPosY);
773
775 Int_t iNumU = 0, iNumV = 0;
776 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
777 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
778
780 if (fRecPosX!=-9999 && fRecPosY!=-9999)
781 {
782 vecFibSel.clear();
783 for (int & iLayer : iFibSel)
784 {
785 vecFibSel.push_back(iLayer);
786 }
787
788 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(3, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
789 }
790
791 delete pMDOverlap;
792 break;
793 }
794 case 4:
795 {
796 ALFA_CenterGravity* pCenterGravity = new ALFA_CenterGravity();
797
800 sc = pCenterGravity->
Finalize(fRecPosX, fRecPosY);
801
803 Int_t iNumU = 0, iNumV = 0;
804 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
805 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
806
807 pCenterGravity->
GetData(iFibSel);
808 if (fRecPosX!=-9999 && fRecPosY!=-9999)
809 {
810 vecFibSel.clear();
811 for (int & iLayer : iFibSel)
812 {
813 vecFibSel.push_back(iLayer);
814 }
815
816 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(4, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
817 }
818
819 delete pCenterGravity;
820 break;
821 }
822 case 5:
823 {
824
827 ALFA_MDMultiple* pMDMultiple = new ALFA_MDMultiple();
828
831 sc = pMDMultiple->
Finalize(fRecPosX, fRecPosY);
832
835 std::fill_n(&iFibSel[0][0], sizeof(iFibSel)/sizeof(Int_t), -9999);
836 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
837 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
838 memset(&iNumU, 0, sizeof(iNumU));
839 memset(&iNumV, 0, sizeof(iNumV));
840
841 pMDMultiple->
GetData(iNumU, iNumV, fOverU, fOverV, iFibSel);
842 for (Int_t iTrack=0; iTrack<
NTRACK; iTrack++)
843 {
844 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
845 {
846 vecFibSel.clear();
848 {
849 vecFibSel.push_back(iFibSel[iTrack][iLayer]);
850 }
851
852 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(5, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
853 }
854 }
855
856 delete pMDMultiple;
857 break;
858 }
859 case 6:
860 {
861
862 ALFA_HalfReco* pHalfReco = new ALFA_HalfReco();
863
864 Int_t iNumU[2] = {0, 0};
865 Int_t iNumV[2] = {0, 0};
866 Int_t iHalfFirst=0;
867 Int_t iHalfSecond=1;
868 Float_t fOverlapU[2] = {-9999, -9999};
869 Float_t fOverlapV[2] = {-9999, -9999};
870 Float_t fRecPosX[2] = {-9999, -9999};
871 Float_t fRecPosY[2] = {-9999, -9999};
872
874 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
875
876 std::vector<int> vecFibSel0;
877 std::vector<int> vecFibSel1;
878 vecFibSel0.clear();
879 vecFibSel1.clear();
880
881 if (eRPName==1 || eRPName==3 || eRPName==6 || eRPName==8)
882 {
883 iHalfFirst = 0;
884 iHalfSecond = 1;
885 }
886 else
887 {
888 iHalfFirst = 1;
889 iHalfSecond = 0;
890 }
891
893 sc = pHalfReco->
Execute(eRPName-1, ListMDHits);
894 sc = pHalfReco->
Finalize(fRecPosX[0], fRecPosY[0]);
895
896 pHalfReco->
GetData(iNumU[0], iNumV[0], fOverlapU[0], fOverlapV[0], iFibSel);
897 vecFibSel0.clear();
898 for (int & iLayer : iFibSel)
899 {
900 vecFibSel0.push_back(iLayer);
901 }
902
904 sc = pHalfReco->
Execute(eRPName-1, ListMDHits);
905 sc = pHalfReco->
Finalize(fRecPosX[1], fRecPosY[1]);
906
907 pHalfReco->
GetData(iNumU[1], iNumV[1], fOverlapU[1], fOverlapV[1], iFibSel);
908 vecFibSel1.clear();
909 for (int & iLayer : iFibSel)
910 {
911 vecFibSel1.push_back(iLayer);
912 }
913
914 if (fRecPosX[0]!=-9999.0 && fRecPosY[0]!=-9999.0 && fRecPosX[1]!=-9999.0 && fRecPosY[1]!=-9999.0)
915 {
916 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(6, eRPName-1, fRecPosX[0], fRecPosY[0], fOverlapU[0], fOverlapV[0], iNumU[0], iNumV[0], std::move(vecFibSel0)));
917 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(6, eRPName-1, fRecPosX[1], fRecPosY[1], fOverlapU[1], fOverlapV[1], iNumU[1], iNumV[1], std::move(vecFibSel1)));
918 }
919
920 delete pHalfReco;
921 break;
922 }
923 case 7:
924 {
927 ALFA_MDGap* pMDGap = new ALFA_MDGap();
928
932
936
937 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
938 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
939 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
940
941 pMDGap->
GetData(iNumU, iNumV, fOverU, fOverV, iFibSel);
942 for (Int_t iTrack=0; iTrack<
NTRACK; iTrack++)
943 {
944 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
945 {
946 vecFibSel.clear();
947 for (int & iLayer : iFibSel)
948 {
949 vecFibSel.push_back(iLayer);
950 }
951
952 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(7, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
953 }
954 }
955
956 delete pMDGap;
957 break;
958 }
959 case 8:
960 {
965
969
970 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
971 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
972 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
973
974
975 std::vector<ALFA_EdgeMethod::Track> tracks;
977
978 for (UInt_t iTrack=0; iTrack<tracks.size(); iTrack++)
979 {
980 pEdgeMethod->
selectedFibers(eRPName - 1, tracks.at(iTrack), iFibSel);
981
982 iNumU[iTrack] = tracks.at(iTrack).first.second;
983 iNumV[iTrack] = tracks.at(iTrack).second.second;
984 fOverU[iTrack] = tracks.at(iTrack).first.first.second;
985 fOverV[iTrack] = tracks.at(iTrack).second.first.second;
986 fRecPosX[iTrack] = 0.5*TMath::Sqrt2()*(-tracks.at(iTrack).
first.first.first-tracks.at(iTrack).second.first.first);
987 fRecPosY[iTrack] = 0.5*TMath::Sqrt2()*(-tracks.at(iTrack).
first.first.first+tracks.at(iTrack).second.first.first);
988
989 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
990 {
991 vecFibSel.clear();
992 for (int & iLayer : iFibSel)
993 {
994 vecFibSel.push_back(iLayer);
995 }
996
997 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(8, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
998 }
999 }
1000
1001 delete pEdgeMethod;
1002 sc = StatusCode::SUCCESS;
1003 break;
1004 }
1005 default:
1006 {
1008 std::cout << "strAlgo: " << strAlgo << std::endl;
1009 return StatusCode::SUCCESS;
1010 }
1011 }
1012
1014
1016}
struct _ODRESULT ODRESULT
void GetData(Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
StatusCode Initialize(const eRPotName &eRPName, const std::list< MDHIT > &ListMDHits, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fzMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT])
void selectedFibers(UInt_t no_Detector, Track &track, Int_t *selectedFib)
void Initialize(Int_t iRPot, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], const std::list< MDHIT > &ListMDHits)
Bool_t EdgeMethod(UInt_t no_Detector, std::vector< Track > &tracks)
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
StatusCode Execute(Int_t iRPot, const std::list< MDHIT > &ListMDHits)
StatusCode Initialize(Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iHalf, Int_t fMultiplicityCut, Int_t iUVCut, Float_t fOverlapCut)
void GetData(Int_t &iNumU, Int_t &iNumV, Float_t &fOvU, Float_t &fOvV, Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Finalize(Float_t(&fRecXPos)[MAXTRACKNUM], Float_t(&fRecYPos)[MAXTRACKNUM])
void GetData(Int_t(&iNumU)[MAXTRACKNUM], Int_t(&iNumV)[MAXTRACKNUM], Float_t(&fOvU)[MAXTRACKNUM], Float_t(&fOvV)[MAXTRACKNUM], Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Initialize(Int_t iRPot, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iUVCut, Float_t fOverlapCut)
StatusCode Execute(const std::list< MDHIT > &ListMDHits)
StatusCode Initialize(Int_t iRPot, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iMultiplicityCut, Int_t iNumLayerCut, Int_t iUVCut, Float_t fOverlapCut)
StatusCode Execute(const std::list< MDHIT > &ListMDHits)
StatusCode Finalize(Float_t(&fRecXPos)[MAXTRACKNUM], Float_t(&fRecYPos)[MAXTRACKNUM])
void GetData(Int_t(&iNumU)[MAXTRACKNUM], Int_t(&iNumV)[MAXTRACKNUM], Float_t(&fOvU)[MAXTRACKNUM], Float_t(&fOvV)[MAXTRACKNUM], Int_t(&iFibSel)[MAXTRACKNUM][ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Initialize(const eRPotName &eRPName, const std::list< MDHIT > &ListMDHits, Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fzMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT])
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
void GetData(Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Finalize(Float_t &fRecXPos, Float_t &fRecYPos)
StatusCode Execute(Int_t iRPot, const std::list< MDHIT > &ListMDHits)
void GetData(Int_t &NumU, Int_t &NumV, Float_t &OL_U, Float_t &OL_V, Int_t(&iFibSel)[ALFALAYERSCNT *ALFAPLATESCNT])
StatusCode Initialize(Float_t faMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Float_t fbMD[RPOTSCNT][ALFALAYERSCNT *ALFAPLATESCNT][ALFAFIBERSCNT], Int_t iMultiplicityCut, Int_t iUVCut, Float_t fOverlapCut)
void GetData(Int_t(&iFibSel)[ODSIDESCNT][ODPLATESCNT])
StatusCode Finalize(std::list< ODRESULT > *pListResults)
StatusCode Execute(Int_t iRPot, const std::list< ODHIT > &ListODHits, Float_t faOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT], Float_t fbOD[RPOTSCNT][ODPLATESCNT][ODSIDESCNT][ODLAYERSCNT *ODFIBERSCNT])
StatusCode Initialize(Int_t fMultiplicityCut, Float_t fDistanceCut, Int_t iLayerCut, Int_t iDataType)