Rev 173 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 173 | Rev 181 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | resol2d->widgetNE[1]->SetNumber(40); |
57 | resol2d->widgetNE[1]->SetNumber(40); |
58 | } |
58 | } |
59 | else if(analTab->GetCurrent() == 1) // Relative PDE |
59 | else if(analTab->GetCurrent() == 1) // Relative PDE |
60 | { |
60 | { |
61 | relPde->widgetChBox[0]->SetState(kButtonDown); |
61 | relPde->widgetChBox[0]->SetState(kButtonDown); |
62 | relPde->widgetChBox[1]->SetState(kButtonUp); |
- | |
63 | midPeak->widgetChBox[0]->SetState(kButtonUp); |
62 | midPeak->widgetChBox[0]->SetState(kButtonUp); |
64 | zeroAngle->widgetNE[0]->SetNumber(0.00); |
63 | zeroAngle->widgetNE[0]->SetNumber(0.00); |
65 | } |
64 | } |
66 | else if(analTab->GetCurrent() == 2) // Breakdown voltage |
65 | else if(analTab->GetCurrent() == 2) // Breakdown voltage |
67 | { |
66 | { |
Line 693... | Line 692... | ||
693 | float progVal = 0; |
692 | float progVal = 0; |
694 | analysisProgress->widgetPB->SetPosition(progVal); |
693 | analysisProgress->widgetPB->SetPosition(progVal); |
695 | gVirtualX->Update(1); |
694 | gVirtualX->Update(1); |
696 | 695 | ||
697 | // Check if the checkbox for no peaks is selected - TODO: Still need the situation when we do not have a peaked ADC spectrum |
696 | // Check if the checkbox for no peaks is selected - TODO: Still need the situation when we do not have a peaked ADC spectrum |
698 |
|
697 | /* if(relPde->widgetChBox[1]->IsDown()) |
699 | { |
698 | { |
700 | printf("PhotonMu(): ADC spectrum has no peak structure.\n"); |
699 | printf("PhotonMu(): ADC spectrum has no peak structure.\n"); |
701 | nopeaks = 1; |
700 | nopeaks = 1; |
702 | 701 | ||
703 | // Error if there is no darkhist |
702 | // Error if there is no darkhist |
Line 710... | Line 709... | ||
710 | delete[] pdeval; |
709 | delete[] pdeval; |
711 | delete[] muval; |
710 | delete[] muval; |
712 | return; |
711 | return; |
713 | } |
712 | } |
714 | 713 | ||
715 |
|
714 | }*/ |
716 | 715 | ||
717 | // Start if we select at least one file |
716 | // Start if we select at least one file |
718 | if(nrfiles > 0) |
717 | if(nrfiles > 0) |
719 | { |
718 | { |
720 | // Find the pedestal peak for the dark histogram, and use it for all if there are no peaks |
719 | // Find the pedestal peak for the dark histogram, and use it for all if there are no peaks |
721 | if(nopeaks != -1) |
720 | if(nopeaks != -1) |
722 | { |
721 | { |
723 | // Replot the spectrum on analysisCanvas and do not close the input file |
722 | // Replot the spectrum on analysisCanvas and do not close the input file |
724 | DisplayHistogram( (char*)(darkRun->widgetTE->GetText()), 0, 1); |
723 | DisplayHistogram( (char*)(darkRun->widgetTE->GetText()), 0, 1); |
725 | analysisCanvas->GetCanvas()->Modified(); |
724 | analysisCanvas->GetCanvas()->Modified(); |
726 | analysisCanvas->GetCanvas()->Update(); |
725 | analysisCanvas->GetCanvas()->Update(); |
727 | 726 | ||
728 | // Get the spectrum |
727 | // Get the spectrum |
729 | histtemp = (TH1F*)analysisCanvas->GetCanvas()->GetPrimitive(histname); |
728 | histtemp = (TH1F*)analysisCanvas->GetCanvas()->GetPrimitive(histname); |
730 | npeaks = 15; |
729 | npeaks = 15; |
731 | double par[300]; |
730 | double par[300]; |
732 | spec = new TSpectrum(npeaks); |
731 | spec = new TSpectrum(npeaks); |
733 | // Find spectrum background |
732 | // Find spectrum background |
734 | histback = spec->Background(histtemp, (int)fitInter->widgetNE[0]->GetNumber(), "same"); |
733 | histback = spec->Background(histtemp, (int)fitInter->widgetNE[0]->GetNumber(), "same"); |
735 | // Clone histogram and subtract background from it if we select that option |
734 | // Clone histogram and subtract background from it if we select that option |
736 | h2 = (TH1F*)histtemp->Clone("h2"); |
735 | h2 = (TH1F*)histtemp->Clone("h2"); |
737 | if(fitChecks->widgetChBox[0]->IsDown()) |
736 | if(fitChecks->widgetChBox[0]->IsDown()) |
738 | h2->Add(histback, -1); |
737 | h2->Add(histback, -1); |
739 | // Search for the peaks |
738 | // Search for the peaks |
740 | int found = spec->Search(h2, fitSigma->widgetNE[0]->GetNumber(), "goff", fitTresh->widgetNE[0]->GetNumber() ); |
739 | int found = spec->Search(h2, fitSigma->widgetNE[0]->GetNumber(), "goff", fitTresh->widgetNE[0]->GetNumber() ); |
741 | printf("PhotonMu(): Found %d candidates to fit.\n",found); |
740 | printf("PhotonMu(): Found %d candidates to fit.\n",found); |
742 | npeaks = found; |
741 | npeaks = found; |
743 | 742 | ||
744 | // Set initial peak parameters |
743 | // Set initial peak parameters |
745 | xpeaks = spec->GetPositionX(); |
744 | xpeaks = spec->GetPositionX(); |
746 | for(j = 0; j < found; j++) |
745 | for(j = 0; j < found; j++) |
747 | { |
746 | { |
748 | float xp = xpeaks[j]; |
747 | float xp = xpeaks[j]; |
749 | int bin = h2->GetXaxis()->FindBin(xp); |
748 | int bin = h2->GetXaxis()->FindBin(xp); |
750 | float yp = h2->GetBinContent(bin); |
749 | float yp = h2->GetBinContent(bin); |
751 | par[3*j] = yp; |
750 | par[3*j] = yp; |
752 | par[3*j+1] = xp; |
751 | par[3*j+1] = xp; |
753 | par[3*j+2] = (double)fitSigma->widgetNE[0]->GetNumber(); |
752 | par[3*j+2] = (double)fitSigma->widgetNE[0]->GetNumber(); |
754 | } |
753 | } |
755 | 754 | ||
756 | // Fit the histogram |
755 | // Fit the histogram |
757 | fit = new TF1("fit", FindPeaks, adcRange->widgetNE[0]->GetNumber(), adcRange->widgetNE[1]->GetNumber(), 3*npeaks); |
756 | fit = new TF1("fit", FindPeaks, adcRange->widgetNE[0]->GetNumber(), adcRange->widgetNE[1]->GetNumber(), 3*npeaks); |
758 | TVirtualFitter::Fitter(histtemp, 3*npeaks); |
757 | TVirtualFitter::Fitter(histtemp, 3*npeaks); |
759 | fit->SetParameters(par); |
758 | fit->SetParameters(par); |
760 | fit->SetNpx(300); |
759 | fit->SetNpx(300); |
761 | h2->Fit("fit","Q"); |
760 | h2->Fit("fit","Q"); |
762 | // Get the fitted parameters |
761 | // Get the fitted parameters |
763 | fittingfunc = h2->GetFunction("fit"); |
762 | fittingfunc = h2->GetFunction("fit"); |
764 | fparam = fittingfunc->GetParameters(); |
763 | fparam = fittingfunc->GetParameters(); |
765 | fparamerr = fittingfunc->GetParErrors(); |
764 | fparamerr = fittingfunc->GetParErrors(); |
766 | 765 | ||
767 | // Gather the parameters (mean peak value for now) |
766 | // Gather the parameters (mean peak value for now) |
768 | int j = 1; |
767 | int j = 1; |
769 | int nrfit = 0; |
768 | int nrfit = 0; |
770 | while(1) |
769 | while(1) |
771 | { |
770 | { |
772 | if( (fparam[j] < 1.E-30) || (nrfit > 8) ) |
771 | if( (fparam[j] < 1.E-30) || (nrfit > 8) ) |
773 | break; |
772 | break; |
774 | else |
773 | else |
775 | { |
774 | { |
776 | // Check if pedestal is above the lower limit and sigma is smaller than the mean |
775 | // Check if pedestal is above the lower limit and sigma is smaller than the mean |
777 | if( (fparam[j] > pedesLow->widgetNE[0]->GetNumber()) && ((double)fparamerr[j]/fparam[j] < accError->widgetNE[0]->GetNumber()) ) |
776 | if( (fparam[j] > pedesLow->widgetNE[0]->GetNumber()) && ((double)fparamerr[j]/fparam[j] < accError->widgetNE[0]->GetNumber()) ) |
778 | { |
777 | { |
779 | // With the additional ADC offset, we can shift the mean values slightly, so they are not close to the X.5, but to the X.0 values |
778 | // With the additional ADC offset, we can shift the mean values slightly, so they are not close to the X.5, but to the X.0 values |
780 | meansel[nrfit] = fparam[j]+(adcOffset->widgetNE[0]->GetNumber()); |
779 | meansel[nrfit] = fparam[j]+(adcOffset->widgetNE[0]->GetNumber()); |
781 | sigmasel[nrfit] = fparam[j+1]; |
780 | sigmasel[nrfit] = fparam[j+1]; |
782 | nrfit++; |
781 | nrfit++; |
783 | } |
782 | } |
784 | } |
783 | } |
Line 862... | Line 861... | ||
862 | { |
861 | { |
863 | if( (nrfiles == 1) || (!multiSelect->widgetChBox[0]->IsDown()) ) |
862 | if( (nrfiles == 1) || (!multiSelect->widgetChBox[0]->IsDown()) ) |
864 | { |
863 | { |
865 | printf("PhotonMu(): Only one file selected. Not running analysis, just showing the fit.\n"); |
864 | printf("PhotonMu(): Only one file selected. Not running analysis, just showing the fit.\n"); |
866 | 865 | ||
867 | // Replot the spectrum on analysisCanvas and do not close the input file |
866 | // Replot the spectrum on analysisCanvas and do not close the input file |
868 | DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0, 1); |
867 | DisplayHistogram( (char*)(files->At(i)->GetTitle()), 0, 1); |
869 | analysisCanvas->GetCanvas()->Modified(); |
868 | analysisCanvas->GetCanvas()->Modified(); |
870 | analysisCanvas->GetCanvas()->Update(); |
869 | analysisCanvas->GetCanvas()->Update(); |
871 | 870 | ||
872 | // Get the spectrum |
871 | // Get the spectrum |
873 | histtemp = (TH1F*)analysisCanvas->GetCanvas()->GetPrimitive(histname); |
872 | histtemp = (TH1F*)analysisCanvas->GetCanvas()->GetPrimitive(histname); |
874 | npeaks = 15; |
873 | npeaks = 15; |
875 | double par[300]; |
874 | double par[300]; |
876 | spec = new TSpectrum(npeaks); |
875 | spec = new TSpectrum(npeaks); |
877 | // Find spectrum background |
876 | // Find spectrum background |
878 | histback = spec->Background(histtemp, (int)fitInter->widgetNE[0]->GetNumber(), "same"); |
877 | histback = spec->Background(histtemp, (int)fitInter->widgetNE[0]->GetNumber(), "same"); |
879 | // Clone histogram and subtract background from it if we select that option |
878 | // Clone histogram and subtract background from it if we select that option |
880 | h2 = (TH1F*)histtemp->Clone("h2"); |
879 | h2 = (TH1F*)histtemp->Clone("h2"); |
881 | if(fitChecks->widgetChBox[0]->IsDown()) |
880 | if(fitChecks->widgetChBox[0]->IsDown()) |
882 | h2->Add(histback, -1); |
881 | h2->Add(histback, -1); |
883 | // Search for the peaks |
882 | // Search for the peaks |
884 | int found = spec->Search(h2, fitSigma->widgetNE[0]->GetNumber(), "goff", fitTresh->widgetNE[0]->GetNumber() ); |
883 | int found = spec->Search(h2, fitSigma->widgetNE[0]->GetNumber(), "goff", fitTresh->widgetNE[0]->GetNumber() ); |
885 | printf("PhotonMu(): Found %d candidates to fit.\n",found); |
884 | printf("PhotonMu(): Found %d candidates to fit.\n",found); |
886 | npeaks = found; |
885 | npeaks = found; |
887 | 886 | ||
888 | // Set initial peak parameters |
887 | // Set initial peak parameters |
889 | xpeaks = spec->GetPositionX(); |
888 | xpeaks = spec->GetPositionX(); |
890 | for(j = 0; j < found; j++) |
889 | for(j = 0; j < found; j++) |
891 | { |
890 | { |
892 | float xp = xpeaks[j]; |
891 | float xp = xpeaks[j]; |
893 | int bin = h2->GetXaxis()->FindBin(xp); |
892 | int bin = h2->GetXaxis()->FindBin(xp); |
894 | float yp = h2->GetBinContent(bin); |
893 | float yp = h2->GetBinContent(bin); |
895 | par[3*j] = yp; |
894 | par[3*j] = yp; |
896 | par[3*j+1] = xp; |
895 | par[3*j+1] = xp; |
897 | par[3*j+2] = (double)fitSigma->widgetNE[0]->GetNumber(); |
896 | par[3*j+2] = (double)fitSigma->widgetNE[0]->GetNumber(); |
898 | } |
897 | } |
899 | 898 | ||
900 | // Fit the histogram |
899 | // Fit the histogram |
901 | fit = new TF1("fit", FindPeaks, adcRange->widgetNE[0]->GetNumber(), adcRange->widgetNE[1]->GetNumber(), 3*npeaks); |
900 | fit = new TF1("fit", FindPeaks, adcRange->widgetNE[0]->GetNumber(), adcRange->widgetNE[1]->GetNumber(), 3*npeaks); |
902 | TVirtualFitter::Fitter(histtemp, 3*npeaks); |
901 | TVirtualFitter::Fitter(histtemp, 3*npeaks); |
903 | fit->SetParameters(par); |
902 | fit->SetParameters(par); |
904 | fit->SetNpx(300); |
903 | fit->SetNpx(300); |
905 | h2->Fit("fit","Q"); |
904 | h2->Fit("fit","Q"); |
906 | // Get the fitted parameters |
905 | // Get the fitted parameters |
907 | fittingfunc = h2->GetFunction("fit"); |
906 | fittingfunc = h2->GetFunction("fit"); |
908 | fparam = fittingfunc->GetParameters(); |
907 | fparam = fittingfunc->GetParameters(); |
909 | fparamerr = fittingfunc->GetParErrors(); |
908 | fparamerr = fittingfunc->GetParErrors(); |
910 | 909 | ||
911 | // Gather the parameters (mean peak value for now) |
910 | // Gather the parameters (mean peak value for now) |
912 | int j = 1; |
911 | int j = 1; |
913 | int nrfit = 0; |
912 | int nrfit = 0; |
914 | while(1) |
913 | while(1) |
915 | { |
914 | { |
Line 1194... | Line 1193... | ||
1194 | exclude = false; |
1193 | exclude = false; |
1195 | 1194 | ||
1196 | // Get next point values (if zero value -> need to add the dark hist value again) |
1195 | // Get next point values (if zero value -> need to add the dark hist value again) |
1197 | pointest[10] = angle[i]; |
1196 | pointest[10] = angle[i]; |
1198 | pointest[11] = muval[i]; |
1197 | pointest[11] = muval[i]; |
- | 1198 | // printf("Last point = [%lf,%lf]\n", pointest[10], pointest[11]); |
|
1199 | 1199 | ||
1200 | // Check if next point has larger error than acceptable (if yes, set exclude signal to true), reuse meansel[0] |
1200 | // Check if next point has larger error than acceptable (if yes, set exclude signal to true), reuse meansel[0] |
1201 | meansel[0] = PointEstimate(5, pointest); // PointEstimate only works with very small step size |
1201 | meansel[0] = PointEstimate(5, pointest); // PointEstimate only works with very small step size |
1202 | if(meansel[0] > accError->widgetNE[0]->GetNumber()) |
1202 | if(meansel[0] > accError->widgetNE[0]->GetNumber()) |
1203 | { |
1203 | { |
1204 | printf("PhotonMu(): Point (%lf, %lf) excluded due to error: %lf\n", pointest[10], pointest[11], meansel[0]); |
1204 | printf("PhotonMu(): Point (%lf, %lf) excluded due to error: %lf\n", pointest[10], pointest[11], meansel[0]); |
- | 1205 | exclude = true; |
|
- | 1206 | } |
|
- | 1207 | ||
- | 1208 | if(isinf(meansel[0])) |
|
- | 1209 | { |
|
- | 1210 | printf("PhotonMu(): Point (%lf, %lf) excluded due to being infinite: %lf\n", pointest[10], pointest[11], meansel[0]); |
|
1205 | exclude = true; |
1211 | exclude = true; |
1206 | } |
1212 | } |
1207 | 1213 | ||
1208 | // Value with 0 angle and dark histogram are always needed, so should not be excluded |
1214 | // Value with 0 angle and dark histogram are always needed, so should not be excluded |
1209 | if(i == darkhist) |
1215 | if(i == darkhist) |
1210 | exclude = false; |
1216 | exclude = false; |
1211 | 1217 | ||
1212 | // If nothing excluded, pass the points in pointest variable like in a FIFO |
1218 | // If nothing excluded, pass the points in pointest variable like in a FIFO |
1213 | if(!exclude) |
1219 | if(!exclude) |
1214 | { |
1220 | { |
1215 | for(int j = 0; j < 10; j++) |
1221 | for(int j = 0; j < 10; j++) |
1216 | { |
1222 | { |
1217 | if(DBGSIG) printf("PhotonMu(): j = %d: Old X value = %lf\n", j, pointest[j]); |
1223 | if(DBGSIG) printf("PhotonMu(): j = %d: Old X value = %lf\n", j, pointest[j]); |
1218 | pointest[j] = pointest[j+2]; |
1224 | pointest[j] = pointest[j+2]; |
1219 | } |
1225 | } |
1220 | } |
1226 | } |
1221 | else |
1227 | else |
1222 | { |
1228 | { |
1223 | for(int j = 0; j < 10; j++) |
1229 | for(int j = 0; j < 10; j++) |
1224 | if(DBGSIG) printf("PhotonMu(): No j = %d: Old X value = %lf\n", j, pointest[j]); |
1230 | if(DBGSIG) printf("PhotonMu(): No j = %d: Old X value = %lf\n", j, pointest[j]); |
1225 | } |
1231 | } |
Line 1228... | Line 1234... | ||
1228 | { |
1234 | { |
1229 | // First 5 points act as estimator points for next one |
1235 | // First 5 points act as estimator points for next one |
1230 | pointest[2*m] = angle[i]; |
1236 | pointest[2*m] = angle[i]; |
1231 | pointest[2*m+1] = muval[i]; |
1237 | pointest[2*m+1] = muval[i]; |
1232 | } |
1238 | } |
- | 1239 | ||
- | 1240 | printf("Exclude signal = %d\n", (int)exclude); |
|
1233 | 1241 | ||
1234 | // Run only if we have a dark run histogram and middle pedestal peak estimation |
1242 | // Run only if we have a dark run histogram and middle pedestal peak estimation |
1235 | if( (darkhist != -1) && midPeak->widgetChBox[0]->IsDown() ) |
1243 | if( (darkhist != -1) && midPeak->widgetChBox[0]->IsDown() ) |
1236 | { |
1244 | { |
1237 | if(DBGSIG) printf("PhotonMu(): m = %d, i = %d: muval = %lf, ", m, i, muval[i]); |
1245 | if(DBGSIG) printf("PhotonMu(): m = %d, i = %d: muval = %lf, ", m, i, muval[i]); |