#include "math.h" #include #include "iostream.h" #include "archparam.h" #include "pisteetoile.h" TransFuncElec PisteEtoile::Trapani; FormePulse PisteEtoile::FPulse(Trapani); int SSTnbPasFit= (int) (2*TFExcursion/TPasTFit); PisteEtoile::PisteEtoile(short NoPhotDiod) { PasTempsEch=0.005836818076; //BUGG doit changer !!!!! Doit etre extrait d'un serveur de param d'acquisition NoPhDiod=NoPhotDiod; DiodVivante=true; AmplNorm=0.; // On echantillonne dix fois plus fin pour avoir une bonne estimation de AmplNorm // Eviter les systematiques 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.FitForme=SuccesAFine; LastEtoile.X2Calc=X2Min; LastEtoile.InpCurrNoisRMS=Vrms/FPulse.GainElectrique(); LastEtoile.TEchan=TIndex; LastEtoile.InpCurrent= AmplRes/FPulse.GainElectrique(); LastEtoile.NoDiode=NoPhDiod; LastEtoile.LargMiHauteur=widthHalfMax; } } // On expedie return testEtoile; } bool PisteEtoile::trig() { MaxIndex=-1; AmplMax=0.; gachette=false; // Copie les données brutes sur la piste. Les met en Volt ADC 12 Bits-10 Volts for(int i=0; i(SeuilGachette*Vrms)) if (fabs(*(pPiste+1))>SeuilGachette*Vrms) { gachette=true; iSeuil=Prepulselong+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+Prepulselong+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 d'avoir un ordre d'idee de 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 un 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); // On calcule l'amplitude estimee a ce temps double Som1=0.; pFitArray=pFitArray0; DeltaTemps=TFExcursion-(X2MinIndex-Di)*TPasTFit; for(int i=0; i