678{
680 if (eRPName < 1){
681 ATH_MSG_ERROR(
"ALFA_LocRec::ExecuteRecoMethod called with invalid detector enum");
682 return StatusCode::FAILURE;
683 }
686 std::list<ODRESULT> listODResults;
687 listODResults.clear();
688 Float_t fRecPosX = -9999.0;
689 Float_t fRecPosY = -9999.0;
690
691 std::map<string, int> mapRecoMethods;
692 mapRecoMethods.clear();
693 mapRecoMethods.insert(std::pair<string, int>("ODTracking", 1));
694 mapRecoMethods.insert(std::pair<string, int>("MDTracking", 2));
695 mapRecoMethods.insert(std::pair<string, int>("MDOverlap", 3));
696 mapRecoMethods.insert(std::pair<string, int>("CenterGravity", 4));
697 mapRecoMethods.insert(std::pair<string, int>("MDMultiple", 5));
698 mapRecoMethods.insert(std::pair<string, int>("HalfReco", 6));
699 mapRecoMethods.insert(std::pair<string, int>("MDGap", 7));
700 mapRecoMethods.insert(std::pair<string, int>("EdgeMethod", 8));
701
702 std::vector<int> vecFibSel;
703 vecFibSel.clear();
704
705 switch(mapRecoMethods[strAlgo])
706 {
707 case 1:
708 {
709 ALFA_ODTracking* pODTracking = new ALFA_ODTracking();
710
714
715 std::list<ODRESULT>::const_iterator
iter;
716 for(iter=listODResults.begin(); iter!=listODResults.end(); ++iter)
717 {
718 ODResults.
iSide = (*iter).iSide;
719 ODResults.
fRecPos = (*iter).fRecPos;
720 ODResults.
fOverY = (*iter).fOverY;
721 ODResults.
iNumY = (*iter).iNumY;
722
723 if ((ODResults.
fRecPos != -9999.0))
724 {
726 std::fill_n(&iFibSel[0][0], sizeof(iFibSel)/sizeof(Int_t), -9999);
727
729 vecFibSel.clear();
731 {
732 vecFibSel.push_back(iFibSel[ODResults.
iSide][iPlate]);
733 }
734
736 }
737 }
738
739 delete pODTracking;
740 break;
741 }
742 case 2:
743 {
744 ALFA_MDTracking* pMDTracking = new ALFA_MDTracking();
746 sc = pMDTracking->
Execute(eRPName-1, ListMDHits);
747 sc = pMDTracking->
Finalize(fRecPosX, fRecPosY);
748
749 if (fRecPosX!=-9999.0 && fRecPosY!=-9999.0)
750 {
752 Int_t iNumU = 0, iNumV = 0;
753 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
754 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
755
756 pMDTracking->
GetData(iNumU, iNumV, fOverlapU, fOverlapV, iFibSel);
757 vecFibSel.clear();
758 for (int & iLayer : iFibSel)
759 {
760 vecFibSel.push_back(iLayer);
761 }
762
763 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(2, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
764 }
765
766 delete pMDTracking;
767 break;
768 }
769 case 3:
770 {
771 ALFA_MDOverlap* pMDOverlap = new ALFA_MDOverlap();
772
775 sc = pMDOverlap->
Finalize(fRecPosX, fRecPosY);
776
778 Int_t iNumU = 0, iNumV = 0;
779 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
780 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
781
783 if (fRecPosX!=-9999 && fRecPosY!=-9999)
784 {
785 vecFibSel.clear();
786 for (int & iLayer : iFibSel)
787 {
788 vecFibSel.push_back(iLayer);
789 }
790
791 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(3, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
792 }
793
794 delete pMDOverlap;
795 break;
796 }
797 case 4:
798 {
799 ALFA_CenterGravity* pCenterGravity = new ALFA_CenterGravity();
800
803 sc = pCenterGravity->
Finalize(fRecPosX, fRecPosY);
804
806 Int_t iNumU = 0, iNumV = 0;
807 Float_t fOverlapU = -9999.0, fOverlapV = -9999.0;
808 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
809
810 pCenterGravity->
GetData(iFibSel);
811 if (fRecPosX!=-9999 && fRecPosY!=-9999)
812 {
813 vecFibSel.clear();
814 for (int & iLayer : iFibSel)
815 {
816 vecFibSel.push_back(iLayer);
817 }
818
819 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(4, eRPName-1, fRecPosX, fRecPosY, fOverlapU, fOverlapV, iNumU, iNumV, std::move(vecFibSel)));
820 }
821
822 delete pCenterGravity;
823 break;
824 }
825 case 5:
826 {
827
830 ALFA_MDMultiple* pMDMultiple = new ALFA_MDMultiple();
831
834 sc = pMDMultiple->
Finalize(fRecPosX, fRecPosY);
835
838 std::fill_n(&iFibSel[0][0], sizeof(iFibSel)/sizeof(Int_t), -9999);
839 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
840 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
841 memset(&iNumU, 0, sizeof(iNumU));
842 memset(&iNumV, 0, sizeof(iNumV));
843
844 pMDMultiple->
GetData(iNumU, iNumV, fOverU, fOverV, iFibSel);
845 for (Int_t iTrack=0; iTrack<
NTRACK; iTrack++)
846 {
847 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
848 {
849 vecFibSel.clear();
851 {
852 vecFibSel.push_back(iFibSel[iTrack][iLayer]);
853 }
854
855 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(5, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
856 }
857 }
858
859 delete pMDMultiple;
860 break;
861 }
862 case 6:
863 {
864
865 ALFA_HalfReco* pHalfReco = new ALFA_HalfReco();
866
867 Int_t iNumU[2] = {0, 0};
868 Int_t iNumV[2] = {0, 0};
869 Int_t iHalfFirst=0;
870 Int_t iHalfSecond=1;
871 Float_t fOverlapU[2] = {-9999, -9999};
872 Float_t fOverlapV[2] = {-9999, -9999};
873 Float_t fRecPosX[2] = {-9999, -9999};
874 Float_t fRecPosY[2] = {-9999, -9999};
875
877 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
878
879 std::vector<int> vecFibSel0;
880 std::vector<int> vecFibSel1;
881 vecFibSel0.clear();
882 vecFibSel1.clear();
883
884 if (eRPName==1 || eRPName==3 || eRPName==6 || eRPName==8)
885 {
886 iHalfFirst = 0;
887 iHalfSecond = 1;
888 }
889 else
890 {
891 iHalfFirst = 1;
892 iHalfSecond = 0;
893 }
894
896 sc = pHalfReco->
Execute(eRPName-1, ListMDHits);
897 sc = pHalfReco->
Finalize(fRecPosX[0], fRecPosY[0]);
898
899 pHalfReco->
GetData(iNumU[0], iNumV[0], fOverlapU[0], fOverlapV[0], iFibSel);
900 vecFibSel0.clear();
901 for (int & iLayer : iFibSel)
902 {
903 vecFibSel0.push_back(iLayer);
904 }
905
907 sc = pHalfReco->
Execute(eRPName-1, ListMDHits);
908 sc = pHalfReco->
Finalize(fRecPosX[1], fRecPosY[1]);
909
910 pHalfReco->
GetData(iNumU[1], iNumV[1], fOverlapU[1], fOverlapV[1], iFibSel);
911 vecFibSel1.clear();
912 for (int & iLayer : iFibSel)
913 {
914 vecFibSel1.push_back(iLayer);
915 }
916
917 if (fRecPosX[0]!=-9999.0 && fRecPosY[0]!=-9999.0 && fRecPosX[1]!=-9999.0 && fRecPosY[1]!=-9999.0)
918 {
919 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)));
920 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)));
921 }
922
923 delete pHalfReco;
924 break;
925 }
926 case 7:
927 {
930 ALFA_MDGap* pMDGap = new ALFA_MDGap();
931
935
939
940 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
941 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
942 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
943
944 pMDGap->
GetData(iNumU, iNumV, fOverU, fOverV, iFibSel);
945 for (Int_t iTrack=0; iTrack<
NTRACK; iTrack++)
946 {
947 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
948 {
949 vecFibSel.clear();
950 for (int & iLayer : iFibSel)
951 {
952 vecFibSel.push_back(iLayer);
953 }
954
955 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(7, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
956 }
957 }
958
959 delete pMDGap;
960 break;
961 }
962 case 8:
963 {
968
972
973 std::fill_n(&iFibSel[0], sizeof(iFibSel)/sizeof(Int_t), -9999);
974 std::fill_n(&fOverU[0], sizeof(fOverU)/sizeof(Float_t), -9999.0);
975 std::fill_n(&fOverV[0], sizeof(fOverV)/sizeof(Float_t), -9999.0);
976
977
978 std::vector<ALFA_EdgeMethod::Track> tracks;
980
981 for (UInt_t iTrack=0; iTrack<tracks.size(); iTrack++)
982 {
983 pEdgeMethod->
selectedFibers(eRPName - 1, tracks.at(iTrack), iFibSel);
984
985 iNumU[iTrack] = tracks.at(iTrack).first.second;
986 iNumV[iTrack] = tracks.at(iTrack).second.second;
987 fOverU[iTrack] = tracks.at(iTrack).first.first.second;
988 fOverV[iTrack] = tracks.at(iTrack).second.first.second;
989 fRecPosX[iTrack] = 0.5*TMath::Sqrt2()*(-tracks.at(iTrack).
first.first.first-tracks.at(iTrack).second.first.first);
990 fRecPosY[iTrack] = 0.5*TMath::Sqrt2()*(-tracks.at(iTrack).
first.first.first+tracks.at(iTrack).second.first.first);
991
992 if (fRecPosX[iTrack] != -9999.0 && fRecPosY[iTrack] != -9999.0)
993 {
994 vecFibSel.clear();
995 for (int & iLayer : iFibSel)
996 {
997 vecFibSel.push_back(iLayer);
998 }
999
1000 m_pLocRecEvCollection->push_back(
new ALFA_LocRecEvent(8, eRPName-1, fRecPosX[iTrack], fRecPosY[iTrack], fOverU[iTrack], fOverV[iTrack], iNumU[iTrack], iNumV[iTrack], vecFibSel));
1001 }
1002 }
1003
1004 delete pEdgeMethod;
1005 sc = StatusCode::SUCCESS;
1006 break;
1007 }
1008 default:
1009 {
1011 std::cout << "strAlgo: " << strAlgo << std::endl;
1012 return StatusCode::SUCCESS;
1013 }
1014 }
1015
1017
1019}
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)