#include #include #include #include "archparam.h" #include "pisteetoile.h" TransFuncElec PisteEtoile::Trapani; FormePulse PisteEtoile::FPulse(Trapani); // D. Yvon, CE Saclay, DAPNIA/SPP, 08/99 PisteEtoile::PisteEtoile(short NoPhotDiod) { PasTempsEch=archParam.acq.perEch; //BUGG doit changer !!!!! Doit etre extrait d'un serveur de param d'acquisition NoPhDiod=NoPhotDiod; DiodVivante=true; SSTnbPasFit= (int) (2*TFExcursion/TPasTFit); AmplNorm=0.; for(int i=0; iSeuilGachette*Vrms)&&SuccesAFine) testEtoile=false; // Test rajouté pour filtrer le bruit en escalier des voies SST // Le fit de forme tasse le bruit et permet un meilleur filtrage. } // Troisième filtre possible: // On tue les evenements trop larges if (widthHalfMax>(FPulse.FWHM()/PasTempsEch+2.)) testEtoile=false; if(testEtoile) { // On emballe une etoile LastEtoile.InpCurrent= AmplRes/FPulse.GainElectrique(); LastEtoile.InpCurFin= AmplFin/FPulse.GainElectrique(); LastEtoile.TEchan=TIndex; LastEtoile.TFin=Tfin; LastEtoile.InpCurrNoisRMS=Vrms/FPulse.GainElectrique(); LastEtoile.X2Calc=X2Min; LastEtoile.NoDiode=NoPhDiod; LastEtoile.FitForme=SuccesAFine; LastEtoile.LargMiHauteur=widthHalfMax; /* cout<(SeuilGachette*Vrms)) if (fabs(*(pPiste+1))>SeuilGachette*Vrms) { gachette=true; iSeuil=Prepulselong-1+i; break; } } if (gachette==true) { // On trouve le maximum MaxIndex=iSeuil; AmplMax=fabs(PhDiodPiste[iSeuil]); for (int i=iSeuil; iAmplMax) { MaxIndex=i; AmplMax=fabs(PhDiodPiste[i]); } } if ((MaxIndex>=PhDiodTabLong-4)||(MaxIndexPrepulselong;HalfMaxInf--) if(fabs(PhDiodPiste[HalfMaxInf])<(AmplMax/2.)) break; int HalfMaxSup; for(HalfMaxSup=MaxIndex;HalfMaxSupPrepulselong)) for(int i=HalfMaxInf; i<=HalfMaxSup; i++) integ+=PhDiodPiste[i]; */ // On fitte une parabole autour du maximum double tmaxfit; if (widthHalfMax>1) { double ymax=PhDiodPiste[MaxIndex]; double yplus=PhDiodPiste[MaxIndex+1]; double ymoins=PhDiodPiste[MaxIndex-1]; // Estimation du temps if(!(ymax==yplus)) { double Y=(yplus-ymax)/(ymax-ymoins); tmaxfit=0.5*(1.+Y)/(1-Y); } else tmaxfit=0.5; // Estimation de l'amplitude double dtplus2=(1.+tmaxfit)*(1.+tmaxfit); double dtmoins2=(1.-tmaxfit)*(1.-tmaxfit); if(dtplus2==dtmoins2) AmplRes=PhDiodPiste[MaxIndex]; else AmplRes= (yplus*dtplus2-ymoins*dtmoins2) / (dtplus2-dtmoins2); } // On stocke les resultats TIndex=indexDebutPiste+MaxIndex+tmaxfit; X2Min=0.; SuccesAFine=false; } return gachette; } void PisteEtoile::demasque() { // Maintenant que l'on se doute que il y a une etoile // On veut connaitre son flux et son temps de passage // Nécessite de connaitre la vitesse de rotation du ballon. // BUGG devra etre extrait des headers acquisition. Ca peut changer!!!!!! int IndexDebutEvt=MaxIndex-SSTLargEvtIndex(); pFitArray0= PhDiodPiste+IndexDebutEvt; // Pointeur origine du tableau d'echantillon sur lequel sera calculé le fit double DeltaTemps=0.; // Pour chaque decalage en temps, on estime une amplitude et calcule le X2 for(int k=0; k0)&&(X2MinIndex<(SSTnbPasFit-1))) { // On fitte une parabole sur les trois X2 qui encadrent le min double Di; // Index (non entier) du minimum du X2 double X=(X2[X2MinIndex+1]-X2Min)/(X2Min-X2[X2MinIndex-1]); Di=0.5*(X+1)/(X-1); // Le X2 est mimimum pour le n° de pas de fit X2MinIndex+Di // On calcule l'amplitude estimee a ce temps double Som1=0.; pFitArray=pFitArray0; DeltaTemps=TFExcursion-(X2MinIndex-Di)*TPasTFit; for(int i=0; i