FEDRA emulsion software from the OPERA Collaboration
AcqOdyssey Class Reference

#include <AcqOdyssey.h>

Inheritance diagram for AcqOdyssey:
Collaboration diagram for AcqOdyssey:

Public Member Functions

 AcqOdyssey ()
 
 AcqOdyssey ()
 
long Clusterize (int N, TClonesArray *Clusters=NULL, int Side=0)
 
long Clusterize (int N, unsigned char *buf, int nc, int nr, TClonesArray *Clusters=NULL, int Side=0)
 
void CopyImageToBG (int N)
 
void CopyImageToBG (int N)
 
void CopyImageToGC (int N, long ConstBG=0)
 
void DrawCircles (float RadPitch=100.)
 
void DrawClear ()
 
void DrawClusters (TClonesArray *Clusters=NULL)
 
void DrawGrid (float MajorPitch=100., float MinorPitch=10.)
 
void DrawText (int Layer, int X, int Y, char *text)
 
void DrawTrack (int N, float X, float Y, float TX, float TY)
 
long FillView (int N, int Side=0, EdbView *View=NULL, bool FillImages=false)
 
void FindClusters (int N)
 
long FindClusters (int N, TClonesArray *Clusters=NULL, int Side=0)
 
void FreeResources ()
 
void FreeResources ()
 
void GetBGImage (short *buf)
 
EdbClustersBoxGetEdbClustersBox (int N1, int N2)
 
EdbFrameGetEdbFrame (int N)
 
EdbImageGetEdbImage (int N)
 
EdbImageGetEdbImage (int N)
 
void GetGCImage (short *buf)
 
void GetImage (int N, char *buf)
 
void GetImage (int N, char *buf)
 
void GetImageFast (int N, unsigned char **buf, long *Pitch, long *Lines)
 
long GrabAndFillView (int N, float *Zs=NULL, double Timeout=0, int Side=0, EdbView *View=NULL, bool FillImages=false)
 
void GrabImages (int N)
 
void GrabImagesONL (int N)
 
int GrabImagesONL (int N, float *Zs=NULL, double Timeout=0)
 
int GrabOneImage (float Z, double Timeout=0)
 
int GrabRawImagesONL (int N, float *Zs=NULL, double Timeout=0)
 
int HFindEdge (int N, int Thresh, int MinWidth, int MaxWidth)
 
bool Initialize (char *DCF, int N)
 
bool Initialize (char *DCF, int N)
 
bool IsGrabComplete ()
 
bool IsGrabComplete ()
 
void PlotBGImage ()
 
void PlotGCImage ()
 
void PlotImage1D (int N, TH1F *hist=NULL)
 
void PlotImage2D (int N)
 
void PutBGImage (short *buf)
 
void PutBGImage (short *buf)
 
void PutGCImage (short *buf)
 
void PutImage (int N, char *buf)
 
void PutImage (int N, char *buf)
 
void SetFIRFKernel (char *Kern, int W, int H)
 
void SetFIRFKernel (char *Kern, int W, int H)
 
void SetFIRFNorm (int Norm)
 
void SetFIRFNorm (int Norm)
 
void ShowBGImage ()
 
void ShowBGImage ()
 
void ShowGCImage ()
 
void ShowImage (int N)
 
void ShowImage (int N)
 
void ShowImages (int N1, int N2, int TimeInterval, int Times)
 
void ShowImages (int N1, int N2, int TimeInterval, int Times)
 
void StartLiveGrab ()
 
void StopLiveGrab ()
 
void TracksFromNImages (int N, float TX, float TY, int Dest)
 
void TracksFromNImages (int N, int DX, int DY, float TX, float TY, int Dest)
 
void UARTSendString (const char *s, int N)
 
int VFindEdge (int N, int Thresh, int MinWidth, int MaxWidth)
 
void XProjectImage (int N, long *buf)
 
void YProjectImage (int N, long *buf)
 
virtual ~AcqOdyssey ()
 
virtual ~AcqOdyssey ()
 

Public Attributes

bool ApplyFIRF
 
bool ApplyGainCorr
 
bool BGImageValid
 
TClonesArray * eEdbClusters
 
EdbVieweEdbView
 
bool GCImageValid
 
int MaxNbGrab
 
float OpticalShrinkage
 
float PixelToMicronX
 
float PixelToMicronY
 
int SizeX
 
int SizeY
 
bool SubtractBG
 
int Threshold
 
char Threshold
 
float ZBuffer [MAX_NB_GRAB]
 

Private Attributes

long BGImage
 
char bNorm
 
long Buffer [MAX_NB_GRAB]
 
long BufferN
 
long Camera
 
long Control
 
long ControlBuf
 
long ConvImage
 
long ConvImage2
 
long ConvImage32
 
long CopyOSB
 
long CopyOSB1
 
long Device
 
long Digitizer
 
long GCImage
 
long GrabOSB
 
long GrabThread
 
long HostBuffer [MAX_NB_GRAB]
 
long HostBufferLines
 
long HostBufferPitch
 
long Kernel
 
MIL_ID MilApplication
 
MIL_ID MilBGImage
 
MIL_ID MilConvImage
 
MIL_ID MilConvImage1
 
MIL_ID MilConvImage2
 
MIL_ID MilConvImage32
 
MIL_ID MilDigitizer
 
MIL_ID MilDisplay
 
MIL_ID MilGCImage
 
MIL_ID MilGCKernel
 
MIL_ID MilImage [MAX_NB_GRAB]
 
MIL_ID MilImageDisp
 
MIL_ID MilImageN
 
MIL_ID MilKernel
 
MIL_ID MilOverlayImage
 
MIL_ID MilProjResX
 
MIL_ID MilProjResY
 
MIL_ID MilSystem
 
long Overlay
 
voidpHostBuffer [MAX_NB_GRAB]
 
long SeqThread
 
long ShiftBuffer [MAX_NB_GRAB]
 
long ShiftList
 
long System
 
long Thread
 
long TransparentColor
 

Constructor & Destructor Documentation

◆ AcqOdyssey() [1/2]

AcqOdyssey::AcqOdyssey ( )
36 {
37  BGImageValid=false;
38  SubtractBG=false;
39  ApplyFIRF=false;
40  eEdbClusters=0;
41  Threshold=50;
42  PixelToMicronX=-0.292;
43  PixelToMicronY=0.292;
44  OpticalShrinkage=1.515;
45  eEdbView=0;
46 
47 
48 }
float PixelToMicronY
Definition: AcqOdyssey.h:179
int Threshold
Definition: AcqOdyssey.h:174
bool ApplyFIRF
Definition: AcqOdyssey.h:172
TClonesArray * eEdbClusters
Definition: AcqOdyssey.h:176
bool SubtractBG
Definition: AcqOdyssey.h:171
EdbView * eEdbView
Definition: AcqOdyssey.h:177
float PixelToMicronX
Definition: AcqOdyssey.h:178
bool BGImageValid
Definition: AcqOdyssey.h:169
float OpticalShrinkage
Definition: AcqOdyssey.h:180

◆ ~AcqOdyssey() [1/2]

AcqOdyssey::~AcqOdyssey ( )
virtual
100 {
101 /*
102  MappFreeDefault(MilApplication, MilSystem, MilDisplay,
103  MilDigitizer, MilImage);
104 */
105  FreeResources();
106 
107 }
void FreeResources()
Definition: AcqOdyssey.cxx:52

◆ AcqOdyssey() [2/2]

AcqOdyssey::AcqOdyssey ( )

◆ ~AcqOdyssey() [2/2]

virtual AcqOdyssey::~AcqOdyssey ( )
virtual

Member Function Documentation

◆ Clusterize() [1/2]

long AcqOdyssey::Clusterize ( int  N,
TClonesArray *  Clusters = NULL,
int  Side = 0 
)
934 {
935  long nc ;
936  long nr ;
937  unsigned char *buf;
938  GetImageFast(N,&buf,&nc,&nr);
939  return Clusterize(N,buf,nc,nr,Clusters,Side);
940 }
long Clusterize(int N, TClonesArray *Clusters=NULL, int Side=0)
Definition: AcqOdyssey.cxx:933
void GetImageFast(int N, unsigned char **buf, long *Pitch, long *Lines)
Definition: AcqOdyssey.cxx:356
Definition: Side.h:11

◆ Clusterize() [2/2]

long AcqOdyssey::Clusterize ( int  N,
unsigned char *  buf,
int  nc,
int  nr,
TClonesArray *  Clusters = NULL,
int  Side = 0 
)
943 {
944 // c++ remake of good old "Fire in steppe" by Valery Tiukov ;-)
945 
946  int pix;
947  int wcl;
948  long ncl=0;
949  int Border=8;
950  float x,y,z,a,v;
951  int s,seg;
952 // printf("Clusterize Image %d: %d %d....",N,nc,nr);
953  // fflush(stdout);
954 
955  EdbCluster *cl=new EdbCluster();
956  if(!Clusters) Clusters=eEdbClusters;
957 // Clusters->Clear();
958 
959 int ir,ic,l;
960 for(int i=0;i<nc*nr;i++)
961 {
962  if(buf[i]==0) continue;
963  ir=int(i/nc);
964  if(ir<Border || ir>nr-Border) continue;
965  ic=i-ir*nc;
966  if(ic<Border || ic>nc-Border) continue;
967  cl->Set0();
968  wcl = BurnPix( buf, ic,ir, nc,nr, cl);
969  cl->Normalize();
970  z=ZBuffer[N];
971  x=(cl->X()-SizeX/2.)*PixelToMicronX;
972  y=(cl->Y()-SizeY/2.)*PixelToMicronY;
973  a=cl->GetArea();
974  if(a<=1) continue;
975  v=cl->GetVolume();
976  l = Clusters->GetLast()+1;
977  new((*Clusters)[l]) EdbCluster( x,y,z, a,v,N,Side,-1 );
978  ncl++;
979 
980 }
981  delete cl;
982  // printf("found %d clusters.\n",ncl);
983  // fflush(stdout);
984 
985  return ncl;
986 }
int BurnPix(unsigned char *buf, int ic, int ir, int xSize, int ySize, EdbCluster *cl)
Definition: AcqOdyssey.cxx:901
void a()
Definition: check_aligned.C:59
int SizeX
Definition: AcqOdyssey.h:168
int SizeY
Definition: AcqOdyssey.h:168
float ZBuffer[MAX_NB_GRAB]
Definition: AcqOdyssey.h:175
Definition: EdbCluster.h:19
virtual Float_t Y() const
Definition: EdbCluster.h:79
virtual Float_t X() const
Definition: EdbCluster.h:78
void Normalize()
Definition: EdbCluster.h:69
Float_t GetVolume() const
Definition: EdbCluster.h:55
Float_t GetArea() const
Definition: EdbCluster.h:54
void Set0()
Definition: EdbCluster.cxx:50
EdbSegP * s
Definition: tlg2pattern.C:32

◆ CopyImageToBG() [1/2]

void AcqOdyssey::CopyImageToBG ( int  N)
371 {
373  BGImageValid=true;
374 
375 }
MFTYPE32 void MFTYPE MbufCopy(MIL_ID SrcBufId, MIL_ID DestBufId)
MIL_ID MilImage[MAX_NB_GRAB]
Definition: AcqOdyssey.h:58
MIL_ID MilBGImage
Definition: AcqOdyssey.h:60

◆ CopyImageToBG() [2/2]

void AcqOdyssey::CopyImageToBG ( int  N)

◆ CopyImageToGC()

void AcqOdyssey::CopyImageToGC ( int  N,
long  ConstBG = 0 
)
378 {
379 char GCKernel[4][4]=
380 {
381  {1,1,1,1},
382  {1,1,1,1},
383  {1,1,1,1},
384  {1,1,1,1}
385 };
386 long ConstBG32;
387 long TargetConstant;
388 MIL_ID MilResult;
391  MbufPut(MilGCKernel,GCKernel);
393  MimClip(MilImage[N],MilGCImage,M_OUT_RANGE,0,255,0,255);
400  // calculate maximum pixel PH
401 // MimFindExtreme(MilGCImage,MilResult,M_MAX_VALUE);
402 // MimGetResult(MilResult,M_VALUE,&MaximumPix);
403 // MaximumPix=MaximumPix*256;
404  ConstBG32=((ConstBG*256) & 0xffff);
405  TargetConstant=0xf0ff - ConstBG32;
406  MimArith(TargetConstant,MilGCImage,MilGCImage,M_CONST_DIV);
407  ConstBG32=ConstBG;
409 // MimArith(MaximumPix,MilGCImage,MilGCImage,M_CONST_DIV); //normalize to MaxPix*256
410 // MimConvolve(MilGCImage,MilGCImage,M_SMOOTH);
411 // MimConvolve(MilGCImage,MilGCImage,M_SMOOTH);
412 // MimConvolve(MilGCImage,MilGCImage,M_SMOOTH);
413 // MbufCopy(MilImage[N],MilGCImage);
414  GCImageValid=true;
416  MimFree(MilResult);
417 
418 }
long MIL_ID
Definition: AcqOdyssey.h:45
#define M_EXTREME_LIST
Definition: Mil.h:3016
#define M_OUT_RANGE
Definition: Mil.h:2765
#define M_SIGNED
Definition: Mil.h:3107
#define M_KERNEL
Definition: Mil.h:3030
#define M_CONST_SUB
Definition: Mil.h:2715
#define M_NORMALIZATION_FACTOR
Definition: Mil.h:4021
#define M_ADD_CONST
Definition: Mil.h:2711
#define M_CONST_DIV
Definition: Mil.h:2743
MFTYPE32 void MFTYPE MbufFree(MIL_ID BufId)
MFTYPE32 void MFTYPE MimArith(double Src1ImageIdOrConstant, double Src2ImageIdOrConstant, MIL_ID DestImageId, long Operation)
MFTYPE32 void MFTYPE MimFree(MIL_ID ImResultId)
MFTYPE32 MIL_ID MFTYPE MimAllocResult(MIL_ID SystemId, long NumberOfResultElement, long ResultType, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 void MFTYPE MimClip(MIL_ID SrcImageId, MIL_ID DestImageId, long Condition, double CondLow, double CondHigh, double WriteLow, double WriteHigh)
MFTYPE32 void MFTYPE MbufControlNeighborhood(MIL_ID BufId, long OperationFlags, long OperationValue)
MFTYPE32 void MFTYPE MimConvolve(MIL_ID SrcImageId, MIL_ID DestImageId, MIL_ID KernelId)
MFTYPE32 MIL_ID MFTYPE MbufAlloc2d(MIL_ID SystemId, long SizeX, long SizeY, long Type, BUFATTRTYPE Attribute, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 void MFTYPE MbufPut(MIL_ID DestBufId, void MPTYPE *BufferPtr)
bool GCImageValid
Definition: AcqOdyssey.h:170
MIL_ID MilSystem
Definition: AcqOdyssey.h:53
MIL_ID MilGCImage
Definition: AcqOdyssey.h:61
MIL_ID MilGCKernel
Definition: AcqOdyssey.h:67

◆ DrawCircles()

void AcqOdyssey::DrawCircles ( float  RadPitch = 100.)
785 {
786  //Draws measuring circles into overlay
787  // the radius pitches are given in microns
788  int rX,rY;
789  float PixPitchX=RadPitch/fabs(PixelToMicronX);
790  float PixPitchY=RadPitch/fabs(PixelToMicronY);
791  for( int d=1; d*PixPitchX*2<SizeX; d++)
792  {
793  rX=int(d*PixPitchX);
794  rY=int(d*PixPitchY);
795  MgraArc(M_DEFAULT, MilOverlayImage, SizeX/2,SizeY/2,rX,rY,0,360);
796  }
797 
798 }
#define M_DEFAULT
Definition: Mil.h:4733
MFTYPE32 void MFTYPE MgraArc(MIL_ID GraphContextId, MIL_ID ImageId, long XCenter, long YCenter, long XRad, long YRad, double StartAngle, double EndAngle)
void d()
Definition: RecDispEX.C:381
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
MIL_ID MilOverlayImage
Definition: AcqOdyssey.h:56

◆ DrawClear()

void AcqOdyssey::DrawClear ( )
860 {
861  // Clear the overlay buffer with the keying color.
863 }
MFTYPE32 void MFTYPE MbufClear(MIL_ID BufId, double Value)
long TransparentColor
Definition: AcqOdyssey.h:57

◆ DrawClusters()

void AcqOdyssey::DrawClusters ( TClonesArray *  Clusters = NULL)
840 {
841  //Draws circles around each cluster
842  // with a diameter equal to cluster diameter;
843  TClonesArray * arr;
844  EdbCluster * cl;
845  int r,x,y;
846  if(!Clusters) arr=eEdbClusters;
847  if(!arr) return;
848  for(int i=0;i<arr->GetEntries();i++)
849  {
850  cl=(EdbCluster*)(arr->At(i));
851  r=int(2.*sqrt(cl->GetArea())/3.14);
852  x=int(cl->GetX()/PixelToMicronX+SizeX/2.);
853  y=int(cl->GetY()/PixelToMicronY+SizeY/2.);
854  MgraArc(M_DEFAULT, MilOverlayImage, x,y,r,r,0,360);
855  }
856 }
Float_t GetX() const
Definition: EdbCluster.h:51
Float_t GetY() const
Definition: EdbCluster.h:52
void r(int rid=2)
Definition: test.C:201

◆ DrawGrid()

void AcqOdyssey::DrawGrid ( float  MajorPitch = 100.,
float  MinorPitch = 10. 
)
801 {
802  //Draws measuring grid into overlay
803  // the pitches are given in microns
804  int X,Y;
805  float PixPitchX=MajorPitch/fabs(PixelToMicronX);
806  float PixPitchY=MajorPitch/fabs(PixelToMicronY);
807  for( int dX=0; dX*PixPitchX*2<SizeX; dX++)
808  {
809  X=int(SizeX/2.+dX*PixPitchX);
811  X=int(SizeX/2.-dX*PixPitchX);
813  }
814  for( int dY=0; dY*PixPitchY*2<SizeY; dY++)
815  {
816  Y=int(SizeY/2.+dY*PixPitchY);
818  Y=int(SizeY/2.-dY*PixPitchY);
820  }
821  PixPitchX=MinorPitch/fabs(PixelToMicronX);
822  PixPitchY=MinorPitch/fabs(PixelToMicronY);
823  for( int dX=0; dX*PixPitchX*2<SizeX; dX++)
824  {
825  X=int(SizeX/2.+dX*PixPitchX);
827  X=int(SizeX/2.-dX*PixPitchX);
829  }
830  for( int dY=0; dY*PixPitchY*2<SizeY; dY++)
831  {
832  Y=int(SizeY/2.+dY*PixPitchY);
834  Y=int(SizeY/2.-dY*PixPitchY);
836  }
837 }
MFTYPE32 void MFTYPE MgraLine(MIL_ID GraphContextId, MIL_ID ImageId, long XStart, long YStart, long XEnd, long YEnd)
Double_t X
Definition: tlg2pattern.C:77
Double_t Y
Definition: tlg2pattern.C:77

◆ DrawText()

void AcqOdyssey::DrawText ( int  Layer,
int  X,
int  Y,
char *  text 
)
779 {
781 
782 }
TText * text
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:164
#define MIL_TEXT(quote)
Definition: Milos.h:85
MFTYPE32 void MFTYPE MgraText(MIL_ID GraphContextId, MIL_ID ImageId, long XStart, long YStart, MIL_TEXT_PTR String)

◆ DrawTrack()

void AcqOdyssey::DrawTrack ( int  N,
float  X,
float  Y,
float  TX,
float  TY 
)
766 {
767  // Draw track on the display overlay according to number of layers N
768  // TX, TY are frame shifts in pixels (frame x w.r.t. frame x-1)
769  // DZ is calculated automatically from Image number (from 0 to N-1)
770  int Ix0,Ix,Iy0,Iy;
771  Ix0=int(X/PixelToMicronX+SizeX/2.);
772  Iy0=int(Y/PixelToMicronY+SizeY/2.);
773  // Ix=int((X+N*TX)/PixelToMicronX+SizeX/2.);
774  // Iy=int((Y+N*TY)/PixelToMicronY+SizeY/2.);
775 
776  MgraLine(M_DEFAULT, MilOverlayImage, Ix0,Iy0, Ix0+N*TX, Iy0+N*TY);
777 }
Double_t TY
Definition: tlg2pattern.C:79
Double_t TX
Definition: tlg2pattern.C:79

◆ FillView()

long AcqOdyssey::FillView ( int  N,
int  Side = 0,
EdbView View = NULL,
bool  FillImages = false 
)
867 {
868  // Finds clusters in a given images sequence (from 0 to N) and fills the EdbView structure
869  // if pointer to View is not given, result is saved into eEdbView;
870  // Cluster coordinates are returned in microns with respect to image center!!!
871  // returns total number of clusters found.
872  printf("Filling View..."); fflush(stdout);
873  long TNumber=0;
874  long Number=0;
875  long PixNumber=0;
876  EdbView *V;
877  TClonesArray * Cl;
878  if(View) V=View; else V=eEdbView;
879  V->Clear();
880  Cl=V->GetClusters();
881  V->SetNframes(N*Side,N*(1-Side));
882  for(int n=0;n<N;n++)
883  {
884  Number=FindClusters(n,Cl,Side);
885  V->AddFrame(n,ZBuffer[n],Number,0);
886  if(FillImages)
887  {
888  ((EdbFrame*)(V->GetFrames()->At(n)))->SetImage(GetEdbImage(n));
889  }
890 
891  TNumber+=Number;
892  }
893  printf("Done.\n"); fflush(stdout);
894  return TNumber;
895 }
FILE * stdout
long FindClusters(int N, TClonesArray *Clusters=NULL, int Side=0)
Definition: AcqOdyssey.cxx:991
EdbImage * GetEdbImage(int N)
Definition: AcqOdyssey.cxx:337
Definition: EdbFrame.h:20
Definition: EdbView.h:134
TClonesArray * GetClusters() const
Definition: EdbView.h:164
TClonesArray * GetFrames() const
Definition: EdbView.h:167
void AddFrame(int id, float z, int ncl=0, int npix=0)
Definition: EdbView.cxx:268
void Clear()
Definition: EdbView.cxx:79
void SetNframes(int top, int bot)
Definition: EdbView.h:184
Int_t View
Definition: tlg2pattern.C:136
Definition: tlg2pattern.C:90

◆ FindClusters() [1/2]

void AcqOdyssey::FindClusters ( int  N)
317 {
318 }

◆ FindClusters() [2/2]

long AcqOdyssey::FindClusters ( int  N,
TClonesArray *  Clusters = NULL,
int  Side = 0 
)
992 {
993  // Finds clusters in a given image
994  // if pointer to Clusters is not given, result is saved into eEdbClusters;
995  // Cluster coordinates are returned in microns with respect to image center!!!
996  // returns number of clusters found.
997  long Result;
998  long FeatList;
999  long Number;
1000  EdbCluster * cl;
1001  IM_BLOB_GROUP5_ST *Group5=0; /* Results */
1002  IM_BLOB_GROUP1_ST *Group1=0; /* Results */
1004  int Border=8;
1005  int DX=SizeX-2*Border;
1006  int DY=SizeY-2*Border;
1007  int OFX,OFY;
1008  OFX=IM_PARENT+Border;
1009  OFY=IM_PARENT+Border+SizeY*N;
1010  imBufChildMove(Thread, ShiftBuffer[N], OFX, OFY, DX, DY);
1011  /* Allocate a blob feature list and result buffer */
1012  imBlobAllocFeatureList(Thread, &FeatList);
1013  imBlobAllocResult(Thread, &Result);
1017  // imBlobSelectFeature(Thread, FeatList, IM_BLOB_MAX_PIXEL, IM_DEFAULT);
1019 
1020  /* Increase speed by not saving runs */
1022 
1023  /* Calculate selected features */
1024  // imBlobCalculate(Thread, Buffer[N], Buffer[N], FeatList, Result, IM_CLEAR, 0);
1025  imBlobCalculate(Thread, ShiftBuffer[N], ShiftBuffer[N], FeatList, Result, IM_CLEAR, 0);
1026 
1027  /* Get the number of blobs */
1028  imBlobGetNumber(Thread, Result, &Number);
1029  /* Allocate enough memory for the results */
1030  Group5 = (IM_BLOB_GROUP5_ST *) malloc(Number * sizeof(IM_BLOB_GROUP5_ST));
1031  Group1 = (IM_BLOB_GROUP1_ST *) malloc(Number * sizeof(IM_BLOB_GROUP1_ST));
1032  /* Get the results */
1033  imBlobGetResult(Thread, Result, IM_BLOB_GROUP5, IM_DEFAULT, Group5);
1034  imBlobGetResult(Thread, Result, IM_BLOB_GROUP1, IM_DEFAULT, Group1);
1035  if(!Clusters) Clusters=eEdbClusters;
1036  // Clusters->Clear();
1037  int i=0;
1038  float x,y,z,a,v;
1039  int s,seg;
1040  int NumberReturned=0;
1041  if(Clusters) for(int cn=0;cn<Number;cn++)
1042  {
1043 /* cl=new EdbCluster();
1044  cl->SetArea(Group1[cn].area);
1045  cl->SetVolume(Group5[cn].sum_pixel);
1046  cl->SetFrame(N);
1047  cl->SetSide(0) ;
1048  cl->SetSegment(0);
1049  cl->SetX((Group1[cn].center_of_gravity_x-SizeX/2.)*PixelToMicronX);
1050  cl->SetY((Group1[cn].center_of_gravity_y-SizeY/2.)*PixelToMicronY);
1051  cl->SetZ(ZBuffer[N]);
1052  */
1053  a=Group1[cn].area;
1054  if(a<=1) continue;
1055  v=Group5[cn].sum_pixel;
1056  x=(Group1[cn].center_of_gravity_x+Border-SizeX/2.)*PixelToMicronX;
1057  y=(Group1[cn].center_of_gravity_y+Border-SizeY/2.)*PixelToMicronY;
1058  z=ZBuffer[N];
1059  i = Clusters->GetLast()+1;
1060  new((*Clusters)[i++]) EdbCluster( x,y,z, a,v,N,Side,-1 );
1061  NumberReturned++;
1062 // Clusters->Add(cl);
1063  }
1064 
1065  // imSyncControl(SeqThread, CopyOSB,IM_OSB_STATE,IM_WAITING);
1066  // imBlobFill(Thread,Result,Overlay,M_ALL_BLOBS,223,CopyOSB);
1067 // imSyncHost(SeqThread, CopyOSB, IM_COMPLETED);
1068 
1069  if(Group1) { delete Group1; Group1=NULL;}
1070  if(Group5) { delete Group5; Group5=NULL;}
1071  imBlobFree(Thread, FeatList);
1072  imBlobFree(Thread, Result);
1074  return NumberReturned;
1075 
1076 }
#define M_NATIVE_MODE_ENTER
Definition: Mil.h:413
#define M_NATIVE_MODE_LEAVE
Definition: Mil.h:414
#define M_NULL
Definition: Mil.h:79
MFTYPE32 void MFTYPE MsysControl(MIL_ID SystemId, long ControlType, MIL_ID TargetSysId)
long ShiftBuffer[MAX_NB_GRAB]
Definition: AcqOdyssey.h:92
long Thread
Definition: AcqOdyssey.h:94
#define IM_BLOB_NO_FEATURES
Definition: imapidef.h:714
#define IM_BLOB_CENTER_OF_GRAVITY
Definition: imapidef.h:713
#define IM_BLOB_SAVE_RUNS
Definition: imapidef.h:735
#define IM_BLOB_GROUP1
Definition: imapidef.h:717
#define IM_DEFAULT
Definition: imapidef.h:262
#define IM_DISABLE
Definition: imapidef.h:268
#define IM_CLEAR
Definition: imapidef.h:285
#define IM_BLOB_SUM_PIXEL
Definition: imapidef.h:687
#define IM_BLOB_GROUP5
Definition: imapidef.h:721
#define IM_BLOB_AREA
Definition: imapidef.h:647
#define IM_PARENT
Definition: imapidef.h:304
IM_EXTC void IM_FTYPE imBlobFree(long Thread, long Result) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobSelectFeature(long Thread, long FeatList, long Feature, long Mode) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobAllocFeatureList(long Thread, long *FeatListPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobCalculate(long Thread, long IdentBuf, long GreyBuf, long FeatList, long Result, long Mode, long OSB) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufChildMove(long Thread, long Child, long Xoff, long Yoff, long Xsize, long Ysize) IM_LFTYPE
IM_EXTC long IM_FTYPE imBlobGetNumber(long Thread, long Result, long *NumPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobAllocResult(long Thread, long *ResultPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobGetResult(long Thread, long Result, long Feature, long Mode, void *ArrayPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBlobControl(long Thread, long Result, long Item, double Value) IM_LFTYPE
#define NULL
Definition: nidaqmx.h:84
Definition: imapitef.h:23
float center_of_gravity_y
Definition: imapitef.h:37
float center_of_gravity_x
Definition: imapitef.h:36
unsigned long area
Definition: imapitef.h:26
Definition: imapitef.h:83
unsigned long sum_pixel
Definition: imapitef.h:86

◆ FreeResources() [1/2]

void AcqOdyssey::FreeResources ( )
53 {
54  /* Clean up */
55  /* Stop the continuous grab and free digitizer (if needed). */
56  if (MilDigitizer)
57  {
60  }
61 
62  /* Deselect the image from the display. */
64 
65  /* Free image. */
67  for (int n=0; n<MAX_NB_GRAB; n++)
68  {
69  if(MilImage[n]) MbufFree(MilImage[n]);
70  }
71  // MbufFree(MilOverlayImage) ;
78  // MbufFree(MilKernel) ;
83  for (int n=0; n<MAX_NB_GRAB; n++)
84  {
86  }
89 
90 
91  /* Free defaults allocations. */
95  // MappFreeDefault(MilApplication, MilSystem, M_NULL, M_NULL, M_NULL);
96 
97 
98 }
#define MAX_NB_GRAB
Definition: AcqOdyssey.h:44
MFTYPE32 void MFTYPE MdispDeselect(MIL_ID DisplayId, MIL_ID ImageId)
MFTYPE32 void MFTYPE MsysFree(MIL_ID SystemId)
MFTYPE32 void MFTYPE MdispFree(MIL_ID DisplayId)
MFTYPE32 void MFTYPE MdigFree(MIL_ID DevId)
MFTYPE32 void MFTYPE MappFree(MIL_ID ApplicationId)
MFTYPE32 void MFTYPE MdigHalt(MIL_ID DevId)
MIL_ID MilProjResY
Definition: AcqOdyssey.h:69
MIL_ID MilDisplay
Definition: AcqOdyssey.h:55
MIL_ID MilProjResX
Definition: AcqOdyssey.h:68
MIL_ID MilImageN
Definition: AcqOdyssey.h:59
MIL_ID MilImageDisp
Definition: AcqOdyssey.h:65
MIL_ID MilConvImage
Definition: AcqOdyssey.h:62
MIL_ID MilConvImage2
Definition: AcqOdyssey.h:63
long Kernel
Definition: AcqOdyssey.h:82
MIL_ID MilDigitizer
Definition: AcqOdyssey.h:54
MIL_ID MilConvImage32
Definition: AcqOdyssey.h:64
MIL_ID MilApplication
Definition: AcqOdyssey.h:52
long HostBuffer[MAX_NB_GRAB]
Definition: AcqOdyssey.h:86
IM_EXTC void IM_FTYPE imBufFree(long Thread, long Buf) IM_LFTYPE

◆ FreeResources() [2/2]

void AcqOdyssey::FreeResources ( )

◆ GetBGImage()

void AcqOdyssey::GetBGImage ( short *  buf)
432 {
433  MbufGet(MilBGImage,buf);
434 }
MFTYPE32 void MFTYPE MbufGet(MIL_ID SourceBufId, void MPTYPE *BufferPtr)

◆ GetEdbClustersBox()

EdbClustersBox * AcqOdyssey::GetEdbClustersBox ( int  N1,
int  N2 
)
1079 {
1080 // EdbClustersBox* cb=new EdbClustersBox();
1081  return NULL;
1082 }

◆ GetEdbFrame()

EdbFrame * AcqOdyssey::GetEdbFrame ( int  N)
331 {
332  EdbFrame *fr=new EdbFrame(N,ZBuffer[N],0,0);
333  fr->SetImage(GetEdbImage(N));
334  return fr;
335 }
void SetImage(EdbImage *image)
Definition: EdbFrame.h:39

◆ GetEdbImage() [1/2]

EdbImage * AcqOdyssey::GetEdbImage ( int  N)
338 {
339  EdbImage* im=new EdbImage();
340  unsigned char *bf;
341  long Sx,Sy;
342 // char *bf=(char*)malloc(SizeX*SizeY);
343 // MbufGet(MilImage[N],bf);
344  GetImageFast(N,&bf,&Sx,&Sy);
345  im->AdoptImage(Sx,Sy,(char*)bf);
346  return im;
347 }
Definition: EdbImage.h:23
void AdoptImage(int columns, int rows, char *image, int col=256)
Definition: EdbImage.cxx:112

◆ GetEdbImage() [2/2]

EdbImage* AcqOdyssey::GetEdbImage ( int  N)

◆ GetGCImage()

void AcqOdyssey::GetGCImage ( short *  buf)
443 {
444  MbufGet(MilGCImage,buf);
445 }

◆ GetImage() [1/2]

void AcqOdyssey::GetImage ( int  N,
char *  buf 
)
350 {
351  MbufGet(MilImage[N],buf);
352 }

◆ GetImage() [2/2]

void AcqOdyssey::GetImage ( int  N,
char *  buf 
)

◆ GetImageFast()

void AcqOdyssey::GetImageFast ( int  N,
unsigned char **  buf,
long Pitch,
long Lines 
)
357 {
363  *buf=(unsigned char*)pHostBuffer[N];
364  *Pitch=HostBufferPitch;
365  *Lines=HostBufferLines;
366 
367 }
long CopyOSB1
Definition: AcqOdyssey.h:98
long HostBufferPitch
Definition: AcqOdyssey.h:90
long HostBufferLines
Definition: AcqOdyssey.h:91
void * pHostBuffer[MAX_NB_GRAB]
Definition: AcqOdyssey.h:88
long SeqThread
Definition: AcqOdyssey.h:94
long Buffer[MAX_NB_GRAB]
Definition: AcqOdyssey.h:85
#define IM_WAITING
Definition: imapidef.h:433
#define IM_COMPLETED
Definition: imapidef.h:437
#define IM_OSB_STATE
Definition: imapidef.h:1087
IM_EXTC void IM_FTYPE imSyncControl(long Thread, long OSB, long Item, double Value) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufCopyPCI(long Thread, long SrcBuf, long DstBuf, long Control, long OSB) IM_LFTYPE
IM_EXTC long IM_FTYPE imSyncHost(long Thread, long OSB, long State) IM_LFTYPE

◆ GrabAndFillView()

long AcqOdyssey::GrabAndFillView ( int  N,
float *  Zs = NULL,
double  Timeout = 0,
int  Side = 0,
EdbView View = NULL,
bool  FillImages = false 
)
605  {
606 // Grabs N images, process them, clusterise by Fire-In-Steep procedure, and fill the EdbView:
607 //if ApplyFIRF and MilKernel are set, then FIR filtering is made
608 // if SubtractBG flag is set - BG image is subtracted
609 // USING ODYSSEY NATIVE MODE
610 // if pointer to View is not given, result is saved into eEdbView;
611 // Cluster coordinates are returned in microns with respect to image center!!!
612 // returns total number of clusters found.
613 // Timeout is given in seconds, if = 0 - waits forever! (caution)
614 // This method is asyncronous combination of GrabImagesONL, Clusterise and FillView...
615 
616  long TNumber=0;
617  long Number=0;
618  long PixNumber=0;
619  EdbView *V;
620  TClonesArray * Cl;
621  if(View) V=View; else V=eEdbView;
622  V->Clear();
623  Cl=V->GetClusters();
624  int NtakenFrames=0;
625 // V->SetNframes(N*Side,N*(1-Side));
626  V->SetNframes(NtakenFrames*Side,NtakenFrames*(1-Side));
627 
629  /* Get ready to grab the sequence */
630  //if(MilKernel) Kernel=MbufInquire(MilKernel,M_NATIVE_ID,M_NULL);
631  printf("Starting Digitizer grab sequence...\n");
633  printf("Waiting for IM_READY from Digitizer...\n");
634  if(Timeout>0) imSyncControl(Thread, GrabOSB,IM_OSB_TIMEOUT, Timeout);
635  if(Timeout>0) imSyncControl(Thread, CopyOSB,IM_OSB_TIMEOUT, Timeout*10);
637  printf("Timeout happened waiting for IM_READY :-(\n");
638  //TODO:
640  return 0;
641  }
642  int Frame=0;
643  /* Sync to each block of frames and display one of them */
644  for (int n = 0; n < N; n++)
645  {
646  // printf("Waiting for frame %d...\n",n);
647  // if(Timeout>0) printf("...with Timeout = %f ms...\n",Timeout*1000.);
649  if(Frame==IM_ERR_TIMEOUT) {
650  printf("Timeout happened waiting for frame %d :-(\n",n);
651  //TODO:
653  return 0;
654  }
655  // printf("Got %d frames :-) Processing frame %d...\n",Frame+1,n);
656  // Now we can process frame
657  if(ApplyGainCorr)
658  {
659  // Multiply image (0-256) by GC map (256-65535 range) into 32 bit buffer
661  // Shift down by 8 bits - must be back in range 0 to 256
663  // negate image (255-Image)
665  }
666  else imIntMonadic(Thread,Buffer[n],255,ConvImage,IM_SUB_NEG,0); //negate only
667 
668 // if(SubtractBG && BGImageValid) {
669 // imIntDyadic(Thread,ConvImage,BGImage,ConvImage,IM_SUB_SAT,CopyOSB);
670 // }
671  if(ApplyFIRF && Kernel) {
674  }
675  if(SubtractBG && BGImageValid) {
677  }
679  // imSyncControl(SeqThread, CopyOSB,IM_OSB_STATE,IM_WAITING);
681 // AT this moment current image processing is charged to thread Thread and we can clusterize the previous image
682 // and fill the EdbView....
683  if(n>0) {
684  Number=Clusterize(n-1,Cl,Side);
685  V->AddFrame(n-1,ZBuffer[n-1],Number,0);
686  if(FillImages) ((EdbFrame*)(V->GetFrames()->At(n-1)))->SetImage(GetEdbImage(n-1));
687  TNumber+=Number;
688  NtakenFrames++;
689  V->SetNframes(NtakenFrames*Side,NtakenFrames*(1-Side));
690 
691  }
692 // Wait till current image processing is complete and go on with next..
693  // imSyncHost(SeqThread, CopyOSB, IM_COMPLETED);
695  printf("Timeout happened waiting for IM_COMPLETED :-(\n");
696  //TODO:
698  return 0;
699  }
700 
701  if(Zs) ZBuffer[n]=Zs[N-n-1];
702 // printf("Done with frame %d. :-) \n",n);
703  }
704 // AT this moment last image is processed and we can clusterize it
705 // and fill the EdbView....
706  Number=Clusterize(N-1,Cl,Side);
707  V->AddFrame(N-1,ZBuffer[N-1],Number,0);
708  if(FillImages) ((EdbFrame*)(V->GetFrames()->At(N-1)))->SetImage(GetEdbImage(N-1));
709  TNumber+=Number;
710  NtakenFrames++;
711  V->SetNframes(NtakenFrames*Side,NtakenFrames*(1-Side));
712 // Finished with the last..
713 
714  /* Wait to make sure the grab OSB is reset for next time */
715  // imSyncHost(SeqThread, GrabOSB, IM_COMPLETED);
717 
719  for(int n=0;n<N;n++) MbufControl(MilImage[n],M_MODIFIED,M_DEFAULT);
721  return TNumber;
722 
723 
724  }
#define M_MODIFIED
Definition: Mil.h:3989
MFTYPE32 void MFTYPE MbufControl(MIL_ID BufId, long OperationFlags, double OperationValue)
long ConvImage
Definition: AcqOdyssey.h:79
long ConvImage2
Definition: AcqOdyssey.h:80
long Digitizer
Definition: AcqOdyssey.h:75
long Camera
Definition: AcqOdyssey.h:74
long ConvImage32
Definition: AcqOdyssey.h:81
long GrabOSB
Definition: AcqOdyssey.h:96
long GCImage
Definition: AcqOdyssey.h:84
long CopyOSB
Definition: AcqOdyssey.h:97
long BufferN
Definition: AcqOdyssey.h:77
bool ApplyGainCorr
Definition: AcqOdyssey.h:173
long ControlBuf
Definition: AcqOdyssey.h:95
long BGImage
Definition: AcqOdyssey.h:83
char bNorm
Definition: AcqOdyssey.h:99
long Control
Definition: AcqOdyssey.h:76
long GrabThread
Definition: AcqOdyssey.h:94
#define IM_SHIFT
Definition: imapidef.h:105
#define IM_OSB_TIMEOUT
Definition: imapidef.h:1090
#define IM_SUB_SAT
Definition: imapidef.h:107
#define IM_SEQ_WAIT
Definition: imapidef.h:1290
#define IM_SEQ_ABORT
Definition: imapidef.h:1292
#define IM_SUB_NEG
Definition: imapidef.h:77
#define IM_ERR_TIMEOUT
Definition: imapidef.h:805
#define IM_READY
Definition: imapidef.h:435
#define IM_LESS
Definition: imapidef.h:60
#define IM_DIV
Definition: imapidef.h:92
#define IM_CLIP
Definition: imapidef.h:371
#define IM_THRESH_CONSTANT
Definition: imapidef.h:328
#define IM_PASS_PIXEL
Definition: imapidef.h:331
#define IM_MULT
Definition: imapidef.h:91
IM_EXTC void IM_FTYPE imIntDyadic(long Thread, long Src1, long Src2, long Dst, long Op, long OSB) IM_LFTYPE
IM_EXTC void IM_FTYPE imIntMonadic(long Thread, long Src, double Const, long Dst, long Op, long OSB) IM_LFTYPE
IM_EXTC long IM_FTYPE imSyncGrabSequence(long Thread, long OSB, long Frame, long Mode) IM_LFTYPE
IM_EXTC void IM_FTYPE imDigGrabSequence(long Thread, long Dig, long Cam, long Buf, long Count, long Control, long OSB) IM_LFTYPE
IM_EXTC void IM_FTYPE imIntConvolve(long Thread, long Src, long Dst, long Kernel, long Control, long OSB) IM_LFTYPE
IM_EXTC void IM_FTYPE imIntConvert(long Thread, long Src, long Dst, long Mode, long OSB) IM_LFTYPE
IM_EXTC void IM_FTYPE imIntClip(long Thread, long Src, long Dst, long Cond, long Thresh, long Thresh_h, long Val1, long Val2, long Mode, long OSB) IM_LFTYPE

◆ GrabImages()

void AcqOdyssey::GrabImages ( int  N)
212 {
213 // Grabs N images, process them and return:
214 //if ApplyFIRF and MilKernel are set, then FIR filtering is made
215 // if SubtractBG flag is set - BG image is subtracted
216 
218  printf("Recording ...\n");
219 long NFields;
220  /* Grab the sequence. */
221  for (int n=0; n<N; n++)
222  {
223  /* Grab one buffer at a time. */
225  if( n>0 )
226  {
227  if(SubtractBG && BGImageValid) {
230  }
231  else MimArith(255,MilImage[n-1],MilConvImage,M_CONST_SUB);
232 
235 
236  }
237  }
238 
239  /* Wait last grab end. */
241  if(SubtractBG && BGImageValid)
242  {
245  }
246  else MimArith(255,MilImage[N-1],MilConvImage,M_CONST_SUB);
247 
250 
251 
252 }
#define M_GRAB_END
Definition: Mil.h:2589
#define M_SUB
Definition: Mil.h:2712
#define M_ASYNCHRONOUS
Definition: Mil.h:3574
#define M_GRAB_MODE
Definition: Mil.h:1779
MFTYPE32 void MFTYPE MdigGrabWait(MIL_ID DevId, long Flag)
MFTYPE32 void MFTYPE MdigGrab(MIL_ID SrcDevId, MIL_ID DestImageId)
MFTYPE32 void MFTYPE MdigControl(MIL_ID DigitizerId, long ControlType, double Value)
MIL_ID MilKernel
Definition: AcqOdyssey_ONL.h:50

◆ GrabImagesONL() [1/2]

void AcqOdyssey::GrabImagesONL ( int  N)
255 {
256 // Grabs N images, process them and return:
257 //if ApplyFIRF and MilKernel are set, then FIR filtering is made
258 // if SubtractBG flag is set - BG image is subtracted
259  // USING ODYSSEY NATIVE MODE
261  /* Get ready to grab the sequence */
263  printf("Programming grab sequence\n");
265  printf("WAiting for IM_READY\n");
266 
268  int Frame=0;
269  /* Sync to each block of frames and display one of them */
270  for (int n = 0; n < N; n++)
271  {
272  printf("Waiting for frame %d\n",n);
274  printf("Got frame %d. Processing\n",Frame);
275 
276  // Now we can process frame
278  if(SubtractBG && BGImageValid) {
280  }
281 
282  if(ApplyFIRF && MilKernel) {
285  }
289  }
290 
291  /* Wait to make sure the grab OSB is reset for next time */
292  // imSyncGrabSequence(Thread, GrabOSB, N-1, IM_SEQ_HALT);
294 
295 
296 
297 
299  for(int n=0;n<N;n++) MbufControl(MilImage[n],M_MODIFIED,M_DEFAULT);
301 
302 }
#define M_NATIVE_ID
Definition: Mil.h:3712
MFTYPE32 long MFTYPE MbufInquire(MIL_ID BufId, long InquireType, void MPTYPE *ResultPtr)
#define IM_SUB
Definition: imapidef.h:76

◆ GrabImagesONL() [2/2]

int AcqOdyssey::GrabImagesONL ( int  N,
float *  Zs = NULL,
double  Timeout = 0 
)
473 {
474 // Grabs N images, process them and return:
475 //if ApplyFIRF and MilKernel are set, then FIR filtering is made
476 // if SubtractBG flag is set - BG image is subtracted
477 // USING ODYSSEY NATIVE MODE
478 // returns number of frames taken
479 // Timeout is given in seconds, if = 0 - waits forever! (caution)
481  /* Get ready to grab the sequence */
482  //if(MilKernel) Kernel=MbufInquire(MilKernel,M_NATIVE_ID,M_NULL);
483  printf("Starting Digitizer grab sequence...\n");
485  printf("Waiting for IM_READY from Digitizer...\n");
486  if(Timeout>0) imSyncControl(Thread, GrabOSB,IM_OSB_TIMEOUT, Timeout);
488  printf("Timeout happened waiting for IM_READY :-(\n");
489  //TODO:
491  return 0;
492  }
493  int Frame=0;
494  /* Sync to each block of frames and display one of them */
495  for (int n = 0; n < N; n++)
496  {
497  // printf("Waiting for frame %d...\n",n);
498  // if(Timeout>0) printf("...with Timeout = %f ms...\n",Timeout*1000.);
500  if(Frame==IM_ERR_TIMEOUT) {
501  printf("Timeout happened waiting for frame %d :-(\n",n);
502  //TODO:
504  return n-1;
505  }
506  // printf("Got %d frames :-) Processing frame %d...\n",Frame+1,n);
507  // Now we can process frame
508  if(ApplyGainCorr)
509  {
510  // Multiply image (0-256) by GC map (256-65535 range) into 32 bit buffer
512  // Shift down by 8 bits - must be back in range 0 to 256
514  // negate image (255-Image)
516  }
517  else imIntMonadic(Thread,Buffer[n],255,ConvImage,IM_SUB_NEG,0); //negate only
518 
519 // if(SubtractBG && BGImageValid) {
520 // imIntDyadic(Thread,ConvImage,BGImage,ConvImage,IM_SUB_SAT,CopyOSB);
521 // }
522  if(ApplyFIRF && Kernel) {
525  }
526  if(SubtractBG && BGImageValid) {
528  }
530  // imSyncControl(SeqThread, CopyOSB,IM_OSB_STATE,IM_WAITING);
532  // imSyncHost(SeqThread, CopyOSB, IM_COMPLETED);
534  if(Zs) ZBuffer[n]=Zs[N-n-1];
535 // printf("Done with frame %d. :-) \n",n);
536  }
537 
538  /* Wait to make sure the grab OSB is reset for next time */
539  // imSyncHost(SeqThread, GrabOSB, IM_COMPLETED);
541 
543  for(int n=0;n<N;n++) MbufControl(MilImage[n],M_MODIFIED,M_DEFAULT);
545  return N;
546 
547 }

◆ GrabOneImage()

int AcqOdyssey::GrabOneImage ( float  Z,
double  Timeout = 0 
)
1085 {
1086  // Sets trigger input of Timer1 from output of Timer2, which runs continuously
1087  // with 50Hz rep. rate (see DCF file)
1090 // here we grab one image
1091  if(GrabAndFillView(1, &Z, Timeout, 0, eEdbView, true)==0) return 0;
1095 // StopLiveGrab();
1096 
1097  return 1;
1098 }
long GrabAndFillView(int N, float *Zs=NULL, double Timeout=0, int Side=0, EdbView *View=NULL, bool FillImages=false)
Definition: AcqOdyssey.cxx:604
struct @8 Z
#define IM_TIMER2
Definition: imapidef.h:1339
#define IM_DIG_EXP_SOURCE
Definition: imapidef.h:1148
IM_EXTC void IM_FTYPE imCamControl(long Thread, long Camera, long Item, double Value) IM_LFTYPE

◆ GrabRawImagesONL()

int AcqOdyssey::GrabRawImagesONL ( int  N,
float *  Zs = NULL,
double  Timeout = 0 
)
550 {
551 // test function
552 // Grabs N images, and return: no processing is done
553 // USING ODYSSEY NATIVE MODE
554 // returns number of frames taken
555 // Timeout is given in seconds, if = 0 - waits forever! (caution)
557  /* Get ready to grab the sequence */
558  //if(MilKernel) Kernel=MbufInquire(MilKernel,M_NATIVE_ID,M_NULL);
559  printf("Starting Digitizer grab sequence...\n");
561  printf("Waiting for IM_READY from Digitizer...\n");
562  if(Timeout>0) imSyncControl(Thread, GrabOSB,IM_OSB_TIMEOUT, Timeout);
564  printf("Timeout happened waiting for IM_READY :-(\n");
565  //TODO:
567  return 0;
568  }
569  int Frame=0;
570  /* Sync to each block of frames and display one of them */
571  for (int n = 0; n < N; n++)
572  {
573  // printf("Waiting for frame %d...\n",n);
574  // if(Timeout>0) printf("...with Timeout = %f ms...\n",Timeout*1000.);
576  if(Frame==IM_ERR_TIMEOUT) {
577  printf("Timeout happened waiting for frame %d :-(\n",n);
578  //TODO:
580  return n-1;
581  }
582  // printf("Got %d frames :-) Processing frame %d...\n",Frame+1,n);
583  // Now we can process frame
584  //imSyncControl(SeqThread, CopyOSB,IM_OSB_STATE,IM_WAITING);
586  //imSyncHost(SeqThread, CopyOSB, IM_COMPLETED);
588  if(Zs) ZBuffer[n]=Zs[N-n-1];
589 // printf("Done with frame %d. :-) \n",n);
590  }
591 
592  /* Wait to make sure the grab OSB is reset for next time */
593  // imSyncHost(SeqThread, GrabOSB, IM_COMPLETED);
595 
597  for(int n=0;n<N;n++) MbufControl(MilImage[n],M_MODIFIED,M_DEFAULT);
599  return N;
600 
601 }

◆ HFindEdge()

int AcqOdyssey::HFindEdge ( int  N,
int  Thresh,
int  MinWidth,
int  MaxWidth 
)
1180  {
1181  // Fing horisontal emulsion edge in image sequence 0-N
1182  long *buf;
1183  buf=new long[SizeY];
1184  long MaxDeriv[MAX_NB_GRAB];
1185  long MinDeriv[MAX_NB_GRAB];
1186  long MaxDerivY[MAX_NB_GRAB];
1187  long MinDerivY[MAX_NB_GRAB];
1188  long MaxDer,MinDer,MaxDerY,MinDerY;
1189  int Delta=30;
1190  for(int n=0;n<N;n++)
1191  {
1192  for(int i=0;i<SizeY;i++) buf[i]=0;
1193  YProjectImage(n,buf);
1194  MaxDeriv[n]=0; MinDeriv[n]=0;
1195  MaxDerivY[n]=0; MinDerivY[n]=0;
1196  for(int i=Delta;i<SizeY-2*Delta;i++)
1197  {
1198  if(MaxDeriv[n]<buf[i]-buf[i+Delta]){ MaxDeriv[n]=buf[i]-buf[i+Delta]; MaxDerivY[n]=i+Delta/2;}
1199  if(MinDeriv[n]>buf[i]-buf[i+Delta]) {MinDeriv[n]=buf[i]-buf[i+Delta]; MinDerivY[n]=i+Delta/2;}
1200  }
1201  }
1202  MaxDer=0;MinDer=0;
1203  for(int n=0;n<N;n++)
1204  {
1205  if(MaxDer<MaxDeriv[n]) {MaxDer=MaxDeriv[n]; MaxDerY=MaxDerivY[n];}
1206  if(MinDer>MinDeriv[n]) {MinDer=MinDeriv[n]; MinDerY=MinDerivY[n];}
1207  }
1208  printf("Max derivative %d detected at Y= %d\n",MaxDer,MaxDerY);
1209  printf("Min derivative %d detected at Y= %d\n",MinDer,MinDerY);
1210  delete [] buf;
1211 
1212  if(MinDer>-Thresh || MaxDer<Thresh || MaxDerY-MinDerY<MinWidth || MaxDerY-MinDerY>MaxWidth) {printf("No edge detected\n"); return -1;}
1213  else printf("Edge detected at %f\n",(MaxDerY+MinDerY)/2.);
1214 
1215  return (MaxDerY+MinDerY)/2.;
1216  }
void YProjectImage(int N, long *buf)
Definition: AcqOdyssey.cxx:1133

◆ Initialize() [1/2]

bool AcqOdyssey::Initialize ( char *  DCF,
int  N 
)
110 {
111 //Initialises the ODYSSEY board with default OPERA parameters
112 // N defines maximum number of layers to take in one grab
113  BGImageValid=false;
114  GCImageValid=false;
115  eEdbClusters=new TClonesArray("EdbCluster",5000);
116  eEdbView=new EdbView();
117  Kernel=0;
118 
119  if(N>MAX_NB_GRAB) N=MAX_NB_GRAB;
120  MaxNbGrab=N;
121  float ImageScale=1;
122  // Allocations.
125 
129  // MdispControl(MilDisplay,M_THREAD_PRIORITY,31);
130  // MdispControl(MilDisplay,M_WINDOW_OVR_DESTRUCTIVE,M_ENABLE);
132  // MdispControl(MilDisplay,M_WINDOW_OVR_FLICKER,M_ENABLE);
133 
134 
135  MdispZoom(MilDisplay,-2,-2);
138  printf("Image size aquired from Digitizer : %d X %d\n",SizeY,SizeX);
139 
140  /* Allocate display buffer. */
142  MbufClear(MilImageDisp, 0x0);
144  /* Prepare overlay buffer. */
145  /***************************/
146 
147  /* Disable overlay display while preparing the data. */
149 
150  /* Enable writing Overlay graphics on top of display buffer. */
152 
153  /* Inquire the Overlay buffer associated with the displayed buffer. */
155 
156  /* Inquire the current transparent color. */
158 
159  /* Clear the overlay buffer with the keying color. */
161 
162  /* Enable the overlay display. */
164  /* Set graphic text to transparent background. */
166 
167  /* Set drawing color to white. */
168  MgraColor(M_DEFAULT, 255);
169 
170 
176  // MbufAlloc2d(MilSystem,SizeX,SizeY, 16L+M_SIGNED,M_IMAGE+M_PROC, &MilConvImage1);
177 
178 
180  MbufClear(MilImageN, 0);
181  for (int n=0; n<N; n++)
182  {
184  }
185  printf("Initialized for grabbing %i frames", N);
186 
187  // Getting ONL handlers for sequence async grab
200  for (int n=0; n<N; n++)
201  {
205  printf("Host buffer %d mapped with pitch %d, %d lines.\n",n,HostBufferPitch,HostBufferLines);
206  if(HostBufferPitch==0) {printf("Can't map buffer! Aborting.\n"); return false;}
207  }
210  // imThrAlloc(Digitizer, 0, &Thread);
211  /* OSB for synchronization */
215  for(int n=0;n<N;n++){
217  }
219 
222 
225 
226  printf("Framegrabber initialized successfully with following parameters:\n");
227  Dump();
228  return true;
229 
230 }
#define M_NATIVE_CONTROL_ID
Definition: Mil.h:3713
#define M_GRAB
Definition: Mil.h:3003
#define M_TRANSPARENT_COLOR
Definition: Mil.h:1609
#define M_PROC
Definition: Mil.h:3004
#define M_NATIVE_THREAD_ID
Definition: Mil.h:412
#define M_OVERLAY_ID
Definition: Mil.h:1193
#define M_SIZE_Y
Definition: Mil.h:4027
#define M_ENABLE
Definition: Mil.h:3683
#define M_OVERLAY_SHOW
Definition: Mil.h:1201
#define M_PROJ_LIST
Definition: Mil.h:3014
#define M_WINDOW_OVR_WRITE
Definition: Mil.h:1437
#define M_UNSIGNED
Definition: Mil.h:149
#define M_DISP
Definition: Mil.h:3005
#define M_IMAGE
Definition: Mil.h:3002
#define M_NATIVE_CAMERA_ID
Definition: Mil.h:1816
#define M_SIZE_X
Definition: Mil.h:4026
#define M_DISABLE
Definition: Mil.h:3684
#define M_BACKGROUND_MODE
Definition: Mil.h:4103
#define M_ON_BOARD
Definition: Mil.h:3123
#define M_TRANSPARENT
Definition: Mil.h:4105
#define M_OVERLAY
Definition: Mil.h:1194
char * MIL_TEXT_PTR
Definition: Milos.h:90
MFTYPE32 long MFTYPE MdispInquire(MIL_ID DisplayId, long inquire_type, void MPTYPE *result_ptr)
MFTYPE32 void MFTYPE MdispControl(MIL_ID DisplayId, long ControlType, double Value)
MFTYPE32 MIL_ID MFTYPE MsysAlloc(MIL_TEXT_PTR SystemTypePtr, long SystemNum, long InitFlag, MIL_ID MPTYPE *SystemIdVarPtr)
MFTYPE32 MIL_ID MFTYPE MdispAlloc(MIL_ID SystemId, long DispNum, MIL_TEXT_PTR DispFormat, long InitFlag, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 void MFTYPE MgraColor(MIL_ID GraphContextId, double ForegroundColor)
MFTYPE32 void MFTYPE MdispZoom(MIL_ID DisplayId, double XFactor, double YFactor)
MFTYPE32 long MFTYPE MdigInquire(MIL_ID DevId, long InquireType, void MPTYPE *ResultPtr)
MFTYPE32 long MFTYPE MsysInquire(MIL_ID SystemId, long InquireType, void MPTYPE *ResultPtr)
MFTYPE32 MIL_ID MFTYPE MappAlloc(long InitFlag, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 MIL_ID MFTYPE MdigAlloc(MIL_ID SystemId, long DeviceNum, MIL_TEXT_PTR DataFormat, long InitFlag, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 void MFTYPE MgraControl(MIL_ID GraphContextId, long ControlType, double ControlValue)
MFTYPE32 MIL_ID MFTYPE MbufChild2d(MIL_ID ParentMilBufId, long OffX, long OffY, long SizeX, long SizeY, MIL_ID MPTYPE *IdVarPtr)
MFTYPE32 void MFTYPE MdispSelect(MIL_ID DisplayId, MIL_ID ImageId)
#define M_DEF_SYSTEM_TYPE
Definition: Milsetup.h:59
#define M_DEF_DISPLAY_FORMAT
Definition: Milsetup.h:79
#define M_DEF_SYSTEM_NUM
Definition: Milsetup.h:60
#define M_DEF_DISPLAY_NUM
Definition: Milsetup.h:78
#define M_SETUP
Definition: Milsetup.h:46
long ShiftList
Definition: AcqOdyssey.h:93
int MaxNbGrab
Definition: AcqOdyssey.h:181
long Overlay
Definition: AcqOdyssey.h:78
long System
Definition: AcqOdyssey.h:72
#define IM_HOST
Definition: imapidef.h:455
#define IM_LONG
Definition: imapidef.h:50
#define IM_PROC
Definition: imapidef.h:453
#define IM_UBYTE
Definition: imapidef.h:45
IM_EXTC void IM_FTYPE imThrAlloc(long Dev, long Control, long *ThreadPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufAlloc1d(long Thread, long Xsize, long Type, long Location, long *BufPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufAlloc2d(long Thread, long Xsize, long Ysize, long Type, long Location, long *BufPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufChild(long Thread, long Buf, long Xstart, long Ystart, long Xsize, long Ysize, long *ChildPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imSyncAlloc(long Thread, long *OSBPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufPut(long Thread, long Buf, void *Ptr) IM_LFTYPE
IM_EXTC long IM_FTYPE imBufMap(long Thread, long Buf, long Band, long Ystart, void **AddrPtr, long *PitchPtr, long *NlinesPtr) IM_LFTYPE

◆ Initialize() [2/2]

bool AcqOdyssey::Initialize ( char *  DCF,
int  N 
)

◆ IsGrabComplete() [1/2]

bool AcqOdyssey::IsGrabComplete ( )
233 {
234  return true;
235 }

◆ IsGrabComplete() [2/2]

bool AcqOdyssey::IsGrabComplete ( )

◆ PlotBGImage()

void AcqOdyssey::PlotBGImage ( )
315 {
317 }

◆ PlotGCImage()

void AcqOdyssey::PlotGCImage ( )
320 {
321 unsigned short *bf;
322 bf=(unsigned short *)malloc(SizeX*SizeY*2);
323 GetGCImage((short*)bf);
324 TH1F *hist= new TH1F("GC","GC",65536,0,65536);
325 for(int c=0;c<SizeX*SizeY;c++) { hist->Fill(bf[c]); }
326 hist->Draw();
327 
328 }
void GetGCImage(short *buf)
Definition: AcqOdyssey.cxx:442
void hist()
Definition: init.C:23

◆ PlotImage1D()

void AcqOdyssey::PlotImage1D ( int  N,
TH1F *  hist = NULL 
)
285 {
286  unsigned char *bf;
287  long Sx,Sy;
288  if(!hist)
289  {
290  TCanvas *c=new TCanvas();
291 // c->Divide(2);
292 // c->cd(1);
293 // GetEdbImage(N)->GetHist2()->Draw("colz");
294  c->cd();
295  GetEdbImage(N)->GetHist1()->Draw();
296  }
297  else
298  {
299  GetImageFast(N,&bf,&Sx,&Sy);
300  for(int c=0;c<Sx*Sy;c++) { hist->Fill(bf[c]); }
301  }
302 }
TH1F * GetHist1() const
Definition: EdbImage.cxx:139
new TCanvas()

◆ PlotImage2D()

void AcqOdyssey::PlotImage2D ( int  N)
305 {
306  TCanvas *c=new TCanvas();
307  c->Divide(2);
308  c->cd(1);
309  GetEdbImage(N)->GetHist2()->Draw("colz");
310  c->cd(2);
311  GetEdbImage(N)->GetHist1()->Draw();
312 }
TH2F * GetHist2(int flip=0) const
Definition: EdbImage.cxx:157

◆ PutBGImage() [1/2]

void AcqOdyssey::PutBGImage ( short *  buf)
426 {
427  MbufPut(MilBGImage,buf);
428  BGImageValid=true;
429 }

◆ PutBGImage() [2/2]

void AcqOdyssey::PutBGImage ( short *  buf)

◆ PutGCImage()

void AcqOdyssey::PutGCImage ( short *  buf)
437 {
438  MbufPut(MilGCImage,buf);
439  GCImageValid=true;
440 }

◆ PutImage() [1/2]

void AcqOdyssey::PutImage ( int  N,
char *  buf 
)
421 {
422  MbufPut(MilImage[N],buf);
423 }

◆ PutImage() [2/2]

void AcqOdyssey::PutImage ( int  N,
char *  buf 
)

◆ SetFIRFKernel() [1/2]

void AcqOdyssey::SetFIRFKernel ( char *  Kern,
int  W,
int  H 
)
244 {
245 // if(MilKernel) MbufFree(MilKernel);
246 // MbufAlloc2d(MilSystem,H,W,8+M_SIGNED,M_KERNEL,&MilKernel);
247 // MbufPut(MilKernel,Kern);
248 
251  imBufPut(Thread,Kernel,Kern);
256 
257 
258  // MbufControlNeighborhood(MilKernel,M_SATURATION,M_ENABLE);
259  // MbufControlNeighborhood(MilKernel,M_ABSOLUTE_VALUE,M_ENABLE);
260  // MbufControlNeighborhood(MilKernel,M_ABSOLUTE_VALUE,M_ENABLE);
261 }
struct @9 H
#define IM_CTL_OVERSCAN_VAL
Definition: imapidef.h:990
#define IM_CTL_OVERSCAN
Definition: imapidef.h:989
#define IM_REPLACE
Definition: imapidef.h:427
#define IM_BYTE
Definition: imapidef.h:48
IM_EXTC void IM_FTYPE imBufAllocControl(long Thread, long *BufPtr) IM_LFTYPE
IM_EXTC void IM_FTYPE imBufPutField(long Thread, long Buf, long Tag, double Value) IM_LFTYPE
Int_t W
Definition: testBGReduction_By_ANN.C:15

◆ SetFIRFKernel() [2/2]

void AcqOdyssey::SetFIRFKernel ( char *  Kern,
int  W,
int  H 
)

◆ SetFIRFNorm() [1/2]

void AcqOdyssey::SetFIRFNorm ( int  Norm)
238 {
239  // if(MilKernel) MbufControlNeighborhood(MilKernel,M_NORMALIZATION_FACTOR,Norm);
240  bNorm=(char)Norm;
241 }
int Norm
int Norm=3;
Definition: hwinit.C:21

◆ SetFIRFNorm() [2/2]

void AcqOdyssey::SetFIRFNorm ( int  Norm)

◆ ShowBGImage() [1/2]

void AcqOdyssey::ShowBGImage ( )
273 {
275 }

◆ ShowBGImage() [2/2]

void AcqOdyssey::ShowBGImage ( )

◆ ShowGCImage()

void AcqOdyssey::ShowGCImage ( )
278 {
279  //imIntMonadic(Thread,ConvImage32,-8,ConvImage,IM_SHIFT,CopyOSB);
281 // MbufCopy(MilGCImage,MilImageDisp);
282 }

◆ ShowImage() [1/2]

void AcqOdyssey::ShowImage ( int  N)
264 {
265  char ztext[64];
266  sprintf(ztext,"Z=%f",ZBuffer[N]);
268  DrawClear();
269  DrawText(0,0,0,ztext);
270 }
void DrawText(int Layer, int X, int Y, char *text)
Definition: AcqOdyssey.cxx:778
void DrawClear()
Definition: AcqOdyssey.cxx:859

◆ ShowImage() [2/2]

void AcqOdyssey::ShowImage ( int  N)

◆ ShowImages() [1/2]

void AcqOdyssey::ShowImages ( int  N1,
int  N2,
int  TimeInterval,
int  Times 
)
448 {
449 // Displays images from N1 to N2 and back with a given time gap
450 // Times times.
451 
452  char ztext[64];
453  sprintf(ztext,"Z from %f to %f",ZBuffer[N1],ZBuffer[N2]);
454 // DrawClear();
455  DrawText(0,0,0,ztext);
456  for(int i=0;i<Times;i++)
457  {
458  for(int N=N1;N<N2;N++)
459  {
461  Sleep(TimeInterval);
462  }
463  for(int N=N2;N>N1;N--)
464  {
466  Sleep(TimeInterval);
467  }
468  }
469 }

◆ ShowImages() [2/2]

void AcqOdyssey::ShowImages ( int  N1,
int  N2,
int  TimeInterval,
int  Times 
)

◆ StartLiveGrab()

void AcqOdyssey::StartLiveGrab ( )
1101 {
1102  // Sets exposure from output of Timer2, which runs continuously
1103  // with 50Hz rep. rate (see DCF file)
1108 
1109 }
MFTYPE32 void MFTYPE MdigGrabContinuous(MIL_ID SrcDevId, MIL_ID DestImageId)

◆ StopLiveGrab()

void AcqOdyssey::StopLiveGrab ( )
1111 {
1112  // Sets trigger input of Timer1 from HW input 0 on DB9 connector, which
1113  // is triggered by BreakPoint output from the stage controller
1114  // This configuration must be default one saved in DCF file
1115  // This function waits for last frame to be completed, so
1116  // if it must be called only when digitizer is in LiveGrab mode!!
1121 
1122 
1123 }

◆ TracksFromNImages() [1/2]

void AcqOdyssey::TracksFromNImages ( int  N,
float  TX,
float  TY,
int  Dest 
)
306 {
307  for(int n=0;n<N;n++)
308  {
310  }
312  imIntAverage(Thread,ShiftList,0,0,Buffer[Dest],N,N,0,CopyOSB);
314 }
IM_EXTC void IM_FTYPE imIntAverage(long Thread, long In, long Acc, long Sum, long Ave, long NumFrame, long Normalize, long Control, long Osb) IM_LFTYPE

◆ TracksFromNImages() [2/2]

void AcqOdyssey::TracksFromNImages ( int  N,
int  DX,
int  DY,
float  TX,
float  TY,
int  Dest 
)
728 {
729  // Calculate average of shifted by TX,TY stack of images a la UTS
730  // TX, TY are frame shifts in pixels (frame x w.r.t. frame x-1)
731  // in the centered ROI of the size DY x DX pixels
732  // Puts the result into Dest Mil buffer
733  // Sync
735  if(DX>SizeX-2*N*TX) DX=SizeX-2*N*TX;
736  if(DY>SizeY-2*N*TY) DY=SizeY-2*N*TY;
737  int OFX,OFY;
738  OFX=IM_PARENT+(SizeX-DX)/2;
739  OFY=IM_PARENT+(SizeY-DY)/2;
740  for(int n=0;n<N;n++)
741  {
742  imBufChildMove(Thread, ShiftBuffer[n], OFX+n*TX, OFY+SizeY*n+n*TY, DX, DY);
743  }
744  imBufChildMove(Thread, ShiftBuffer[Dest], OFX, OFY+SizeY*Dest, DX, DY);
745 
746  imBufClear(Thread,Buffer[Dest],0,CopyOSB); //clear destination buffer
747 // imSyncControl(SeqThread, CopyOSB,IM_OSB_STATE,IM_WAITING);
748  imIntAverage(Thread, ShiftList, 0, 0, ShiftBuffer[Dest], N, N, 0,CopyOSB);
749  if(ApplyFIRF && Kernel)
750  {
754 
755  }
756 // imIntClip(Thread,ShiftBuffer[Dest],ShiftBuffer[Dest],IM_OUT_RANGE,Threshold,255,0,255,IM_PASS_PIXEL,CopyOSB);
761 
762 }
#define IM_PASS_CONSTANT
Definition: imapidef.h:330
IM_EXTC void IM_FTYPE imBufClear(long Thread, long Buf, double Value, long OSB) IM_LFTYPE

◆ UARTSendString()

void AcqOdyssey::UARTSendString ( const char *  s,
int  N 
)
1218  {
1219  long adc=(long)s;
1223  for(int i=0;i<N;i++){
1225  }
1227 
1228  }
#define IM_CHANNEL_0
Definition: imapidef.h:1306
#define IM_UART_WRITE_STRING
Definition: imapidef.h:1189
#define IM_UART_WRITE_LENGTH
Definition: imapidef.h:1188
#define IM_UART_BAUD_RATE
Definition: imapidef.h:1178
IM_EXTC void IM_FTYPE imDigControl(long Thread, long Dig, long Item, double Value) IM_LFTYPE
MFTYPE32 long(MFTYPE MPTYPE *MOCRHOOKFCTPTR)(long HookType
Definition: milocr.h:32

◆ VFindEdge()

int AcqOdyssey::VFindEdge ( int  N,
int  Thresh,
int  MinWidth,
int  MaxWidth 
)
1142  {
1143  // Fing horisontal emulsion edge in image sequence 0-N
1144  long *buf;
1145  buf=new long[SizeX];
1146  long MaxDeriv[MAX_NB_GRAB];
1147  long MinDeriv[MAX_NB_GRAB];
1148  long MaxDerivX[MAX_NB_GRAB];
1149  long MinDerivX[MAX_NB_GRAB];
1150  long MaxDer,MinDer,MaxDerX,MinDerX;
1151  int Delta=30;
1152  for(int n=0;n<N;n++)
1153  {
1154  for(int i=0;i<SizeX;i++) buf[i]=0;
1155  XProjectImage(n,buf);
1156  MaxDeriv[n]=0; MinDeriv[n]=0;
1157  MaxDerivX[n]=0; MinDerivX[n]=0;
1158  for(int i=Delta;i<SizeX-2*Delta;i++)
1159  {
1160  if(MaxDeriv[n]<buf[i]-buf[i+Delta]){ MaxDeriv[n]=buf[i]-buf[i+Delta]; MaxDerivX[n]=i+Delta/2;}
1161  if(MinDeriv[n]>buf[i]-buf[i+Delta]) {MinDeriv[n]=buf[i]-buf[i+Delta]; MinDerivX[n]=i+Delta/2;}
1162  }
1163  }
1164  MaxDer=0;MinDer=0;
1165  for(int n=0;n<N;n++)
1166  {
1167  if(MaxDer<MaxDeriv[n]) {MaxDer=MaxDeriv[n]; MaxDerX=MaxDerivX[n];}
1168  if(MinDer>MinDeriv[n]) {MinDer=MinDeriv[n]; MinDerX=MinDerivX[n];}
1169  }
1170  printf("Max derivative %d detected at X= %d\n",MaxDer,MaxDerX);
1171  printf("Min derivative %d detected at X= %d\n",MinDer,MinDerX);
1172  delete [] buf;
1173 
1174  if(MinDer>-Thresh || MaxDer<Thresh || MaxDerX-MinDerX<MinWidth || MaxDerX-MinDerX>MaxWidth) {printf("No edge detected\n"); return -1;}
1175  else printf("Edge detected at %f\n",(MaxDerX+MinDerX)/2.);
1176 
1177  return (MaxDerX+MinDerX)/2.;
1178  }
void XProjectImage(int N, long *buf)
Definition: AcqOdyssey.cxx:1126

◆ XProjectImage()

void AcqOdyssey::XProjectImage ( int  N,
long buf 
)
1127  {
1128  // Projects image to horisontal axis and fill the linear buffer buf
1131 
1132  }
#define M_VALUE
Definition: Mil.h:2675
#define M_0_DEGREE
Definition: Mil.h:2872
MFTYPE32 void MFTYPE MimProject(MIL_ID SrcImageId, MIL_ID DestArrayId, double ProjectionAngle)
MFTYPE32 void MFTYPE MimGetResult1d(MIL_ID ImResultId, long Offresult, long Sizeresult, long ResultType, void MPTYPE *UserTargetArrayPtr)

◆ YProjectImage()

void AcqOdyssey::YProjectImage ( int  N,
long buf 
)
1134  {
1135  // Projects image to horisontal axis and fill the linear buffer buf
1138 
1139  }
#define M_90_DEGREE
Definition: Mil.h:2873

Member Data Documentation

◆ ApplyFIRF

bool AcqOdyssey::ApplyFIRF

◆ ApplyGainCorr

bool AcqOdyssey::ApplyGainCorr

◆ BGImage

long AcqOdyssey::BGImage
private

◆ BGImageValid

bool AcqOdyssey::BGImageValid

◆ bNorm

char AcqOdyssey::bNorm
private

◆ Buffer

long AcqOdyssey::Buffer
private

◆ BufferN

long AcqOdyssey::BufferN
private

◆ Camera

long AcqOdyssey::Camera
private

◆ Control

long AcqOdyssey::Control
private

◆ ControlBuf

long AcqOdyssey::ControlBuf
private

◆ ConvImage

long AcqOdyssey::ConvImage
private

◆ ConvImage2

long AcqOdyssey::ConvImage2
private

◆ ConvImage32

long AcqOdyssey::ConvImage32
private

◆ CopyOSB

long AcqOdyssey::CopyOSB
private

◆ CopyOSB1

long AcqOdyssey::CopyOSB1
private

◆ Device

long AcqOdyssey::Device
private

◆ Digitizer

long AcqOdyssey::Digitizer
private

◆ eEdbClusters

TClonesArray* AcqOdyssey::eEdbClusters

◆ eEdbView

EdbView* AcqOdyssey::eEdbView

◆ GCImage

long AcqOdyssey::GCImage
private

◆ GCImageValid

bool AcqOdyssey::GCImageValid

◆ GrabOSB

long AcqOdyssey::GrabOSB
private

◆ GrabThread

long AcqOdyssey::GrabThread
private

◆ HostBuffer

long AcqOdyssey::HostBuffer[MAX_NB_GRAB]
private

◆ HostBufferLines

long AcqOdyssey::HostBufferLines
private

◆ HostBufferPitch

long AcqOdyssey::HostBufferPitch
private

◆ Kernel

long AcqOdyssey::Kernel
private

◆ MaxNbGrab

int AcqOdyssey::MaxNbGrab

◆ MilApplication

MIL_ID AcqOdyssey::MilApplication
private

◆ MilBGImage

MIL_ID AcqOdyssey::MilBGImage
private

◆ MilConvImage

MIL_ID AcqOdyssey::MilConvImage
private

◆ MilConvImage1

MIL_ID AcqOdyssey::MilConvImage1
private

◆ MilConvImage2

MIL_ID AcqOdyssey::MilConvImage2
private

◆ MilConvImage32

MIL_ID AcqOdyssey::MilConvImage32
private

◆ MilDigitizer

MIL_ID AcqOdyssey::MilDigitizer
private

◆ MilDisplay

MIL_ID AcqOdyssey::MilDisplay
private

◆ MilGCImage

MIL_ID AcqOdyssey::MilGCImage
private

◆ MilGCKernel

MIL_ID AcqOdyssey::MilGCKernel
private

◆ MilImage

MIL_ID AcqOdyssey::MilImage
private

◆ MilImageDisp

MIL_ID AcqOdyssey::MilImageDisp
private

◆ MilImageN

MIL_ID AcqOdyssey::MilImageN
private

◆ MilKernel

MIL_ID AcqOdyssey::MilKernel
private

◆ MilOverlayImage

MIL_ID AcqOdyssey::MilOverlayImage
private

◆ MilProjResX

MIL_ID AcqOdyssey::MilProjResX
private

◆ MilProjResY

MIL_ID AcqOdyssey::MilProjResY
private

◆ MilSystem

MIL_ID AcqOdyssey::MilSystem
private

◆ OpticalShrinkage

float AcqOdyssey::OpticalShrinkage

◆ Overlay

long AcqOdyssey::Overlay
private

◆ pHostBuffer

void* AcqOdyssey::pHostBuffer[MAX_NB_GRAB]
private

◆ PixelToMicronX

float AcqOdyssey::PixelToMicronX

◆ PixelToMicronY

float AcqOdyssey::PixelToMicronY

◆ SeqThread

long AcqOdyssey::SeqThread
private

◆ ShiftBuffer

long AcqOdyssey::ShiftBuffer
private

◆ ShiftList

long AcqOdyssey::ShiftList
private

◆ SizeX

int AcqOdyssey::SizeX

◆ SizeY

int AcqOdyssey::SizeY

◆ SubtractBG

bool AcqOdyssey::SubtractBG

◆ System

long AcqOdyssey::System
private

◆ Thread

long AcqOdyssey::Thread
private

◆ Threshold [1/2]

int AcqOdyssey::Threshold

◆ Threshold [2/2]

char AcqOdyssey::Threshold

◆ TransparentColor

long AcqOdyssey::TransparentColor
private

◆ ZBuffer

float AcqOdyssey::ZBuffer[MAX_NB_GRAB]

The documentation for this class was generated from the following files: