예제 #1
0
        public bool ParseInput(List <byte> pack, int err = 0)
        {
            {
                int i = 0;
                //for (int ii = 0; ii < 480; ii++)
                //{
                //    Console.Write(Convert.ToString((i ) + (32 * ii), 16) + "(" + (ii ).ToString() + ") => ");
                //    for (int jj = 0; jj < 16; jj++)
                //    {
                //        int this_index = (i) + (32 * ii) + jj * 2;
                //        Console.Write(Convert.ToString(pack[this_index] * 256 + pack[this_index + 1], 16) + " ");
                //    }
                //    Console.WriteLine();
                //}
            }
            try
            {
                //i is the byte offset counter
                this.RecTime = DateTime.Now;
                #region SpillHeader
                //spill word count 0123
                int    i   = 0;
                UInt32 t32 = 0;
                t32 = (UInt32)(pack[i] * 256 * 256 * 256 + pack[i + 1] * 256 * 256 + pack[i + 2] * 256 + pack[i + 3]);
                this.SpillWordCount = t32;

                //spill trig count 4567
                i   = 4; t32 = 0;
                t32 = (UInt32)(pack[i] * 256 * 256 * 256 + pack[i + 1] * 256 * 256 + pack[i + 2] * 256 + pack[i + 3]);
                this.SpillTrigCount = t32;

                //spill counter 89
                i = 8;
                UInt16 t16 = 0;
                t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.SpillCounter = t16;

                //mask 10,11
                i         = 10; t16 = 0;
                t16       = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.Mask = t16;
                //from this, we can figure out the num of ch
                this.ExpectNumCh = 0;
                for (int p = 0; p < 16; p++)
                {
                    if ((Convert.ToUInt16(Math.Pow(2, 1)) & this.Mask) == Convert.ToUInt16(Math.Pow(2, 1)))
                    {
                        this.ExpectNumCh++;
                    }
                }

                //board id 12,13
                i            = 12; t16 = 0;
                t16          = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.BoardID = t16;

                //spill status 14,15
                i   = 14; t16 = 0;
                t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.SpillStatus = t16;

                #endregion SpillHeader

                UInt32 event_num_left         = this.SpillTrigCount;
                bool   first_event_of_spill   = true;
                UInt16 ExpectedEventWordCount = 0;
                UInt32 StartPointer           = 0x10;
                UInt32 myTriggerCount         = 0;
                i = 16;
                int      ch_num        = 0;
                DateTime start_parsing = DateTime.Now;



                while (event_num_left > 0)
                {
                    mu2e_Event this_event = new mu2e_Event();
                    #region EventHeader
                    //event word count
                    //i is 16 at this point for the first event
                    t16 = 0;


                    t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                    this_event.EventWordCount = t16;
                    if (first_event_of_spill)
                    {
                        first_event_of_spill = false; ExpectedEventWordCount = t16;
                    }
                    else
                    {
                        UInt32 myPointer = StartPointer + (UInt32)(2 * ExpectedEventWordCount) * myTriggerCount;
                        int    ioff      = -20;
                        Console.WriteLine("My pointer is =0x{0}", Convert.ToString(myPointer, 16));
                        i = (int)(myPointer + 0x10);
                        //------------------------------------------------------
                        for (int ii = 0; ii < 8; ii++)
                        {
                            Console.Write(Convert.ToString((i - 64) + (32 * ii), 16) + "(" + (ii - 2).ToString() + ") => ");
                            for (int jj = 0; jj < 16; jj++)
                            {
                                int this_index = (i - 64) + (32 * ii) + jj * 2;
                                Console.Write(Convert.ToString(pack[this_index] * 256 + pack[this_index + 1], 16) + " ");
                            }
                            Console.WriteLine();
                        }
                        //------------------------------------------------------
                        while (ioff < 64)
                        {
                            t16 = (UInt16)(pack[i + ioff] * 256 + pack[i + ioff + 1]);
                            //   Console.WriteLine("ioff={0}, t16={1}", ioff, Convert.ToString( t16,16));
                            if (t16 == ExpectedEventWordCount)
                            {
                                Console.WriteLine("Found correct offset at {0} for trig {1}", ioff, this_event.TrigCounter);
                                //for (int ii = 0; ii < 15; ii++)
                                //{
                                //    Console.Write((i - 32 - (128 * 16) + (ii * 16).ToString()) + "(" + (ii - 1).ToString() + ") => ");
                                //    for (int jj = 0; jj < 16; jj++)
                                //    {
                                //        int this_index = (i - 32) + (32 * ii) + jj * 2;
                                //        Console.Write(Convert.ToString(pack[this_index], 16) + Convert.ToString(pack[this_index + 1], 16) + " ");
                                //    }
                                //    Console.WriteLine();
                                //}
                                i   = i + ioff;
                                t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                                this_event.EventWordCount = t16;
                                ioff = 100;
                            }
                            ioff++;
                        }
                    }
                    Console.WriteLine("i={0},ThisEventWordCount={1}", Convert.ToString(i, 16), Convert.ToString(this_event.EventWordCount, 16));
                    i = i + 2;
                    //event time stamp
                    t32 = 0;
                    t32 = (UInt32)(pack[i++] * 256 * 256 * 256 + pack[i++] * 256 * 256 + pack[i++] * 256 + pack[i++]);
                    this_event.EventTimeStamp = t32;

                    //trigger counter
                    t32 = 0;
                    t32 = (UInt32)(pack[i++] * 256 * 256 * 256 + pack[i++] * 256 * 256 + pack[i++] * 256 + pack[i++]);
                    this_event.TrigCounter = t32;

                    //event num samples
                    t16 = 0;
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.NumSamples = t16;

                    //event trig type
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.TrigType = t16;

                    //event stsus
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.EventStatus = t16;

                    #endregion EventHeader

                    #region EventData
                    if (this_event.NumSamples == 0)
                    {
                        Console.WriteLine("stop!");
                    }
                    int num_ch = Convert.ToInt32(this_event.EventWordCount / this_event.NumSamples);

                    for (int k = 0; k < num_ch; k++)
                    {
                        int[] ch_data = new int[this_event.NumSamples];
                        for (int j = 0; j < this_event.NumSamples; j++)
                        {
                            t16        = (UInt16)(pack[i++] * 256 + pack[i++]);
                            ch_data[j] = t16;
                            if (ch_data[j] > 0x800)
                            {
                                ch_data[j] = ch_data[j] - 0xfff;
                            }
                            if ((j == 0) || (j == 0x7f))
                            {
                                //for (int ii = i; ii < i + 33; ii++)
                                //{ Console.WriteLine(ii + "(" + (ii - i).ToString() + ") => " + Convert.ToString(pack[ii], 16)); }
                            }
                        }
                        mu2e_Ch this_ch = new mu2e_Ch();
                        this_ch.num_ch = k + 1;
                        this_ch.data   = ch_data;
                        this_event.ChanData.Add(this_ch);
                    }

                    Console.WriteLine("end of event {0} at time {1}-----------------", this_event.TrigCounter, this_event.EventTimeStamp);


                    //for (int ii = 0; ii < 20; ii++)
                    //{
                    //    Console.Write((i - 32 - (128 * 16) + (ii * 16).ToString()) + "(" + (ii - 1).ToString() + ") => ");
                    //    for (int jj = 0; jj < 16; jj++)
                    //    {
                    //        int this_index = (i - 32) + (32 * ii) + jj * 2;
                    //        Console.Write(Convert.ToString(pack[this_index], 16) + Convert.ToString(pack[this_index + 1], 16) + " ");
                    //    }
                    //    Console.WriteLine();
                    //}
                    //=======================================================================================================
                    if (first_event_of_spill)
                    {
                        i = i + (int)(this_event.TrigCounter * 16);
                    }                                              //i don't know why there are these extra 16 bytes here
                    //=======================================================================================================

                    //for (int ii = 0; ii < 5; ii++)
                    //{
                    //    Console.Write((i - 32 + (ii * 16).ToString()) + "(" + (ii - 1).ToString() + ") => ");
                    //    for (int jj = 0; jj < 16; jj++)
                    //    {
                    //        int this_index = (i - 32) + (32 * ii) + jj * 2;
                    //        Console.Write(Convert.ToString(pack[this_index], 16) + Convert.ToString(pack[this_index + 1], 16) + " ");
                    //    }
                    //    Console.WriteLine();
                    //}

                    #endregion EventData

                    myTriggerCount++;
                    event_num_left--;
                    this.SpillEvents.AddLast(this_event);
                }
                DateTime end_parsing   = DateTime.Now;
                TimeSpan time_to_parse = end_parsing.Subtract(start_parsing);
                Console.WriteLine("Time to parse {0} events was {1} ms", this.SpillTrigCount, time_to_parse.TotalMilliseconds);
                return(true);
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught exception " + e.Message + " in spill data");
                return(false);
            }
        }
예제 #2
0
파일: SpillData.cs 프로젝트: UVaHEP/TB_mu2e
        public bool ParseInput(byte[] pack, int err = 0)
        {
            if (pack.Length < 0x810)
            { //empty event
                return(false);
            }
            //{
            //    int i = 0;
            //    for (int ii = 0; ii < 480; ii++)
            //    {
            //        if (PP.glbDebug){ Console.Write(Convert.ToString((i) + (32 * ii), 16) + "(" + (ii).ToString() + ") => ");
            //        for (int jj = 0; jj < 16; jj++)
            //        {
            //            int this_index = (i) + (32 * ii) + jj * 2;
            //            if (PP.glbDebug){ Console.Write(Convert.ToString(pack[this_index] * 256 + pack[this_index + 1], 16) + " ");}
            //        }
            //        if (PP.glbDebug){ Console.WriteLine();}
            //    }
            //}
            try
            {
                //i is the byte offset counter
                this.RecTime = DateTime.Now;
                #region SpillHeader
                //spill word count 0123
                int    i   = 0;
                UInt32 t32 = 0;
                t32 = (UInt32)(pack[i] * 256 * 256 * 256 + pack[i + 1] * 256 * 256 + pack[i + 2] * 256 + pack[i + 3]);
                this.SpillWordCount = t32;

                //spill trig count 4567
                i   = 4; t32 = 0;
                t32 = (UInt32)(pack[i] * 256 * 256 * 256 + pack[i + 1] * 256 * 256 + pack[i + 2] * 256 + pack[i + 3]);
                this.SpillTrigCount = t32;



                //spill counter 89
                i = 8;
                UInt16 t16 = 0;
                t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.SpillCounter = t16;

                //mask 10,11
                i         = 10; t16 = 0;
                t16       = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.Mask = t16;
                //from this, we can figure out the num of ch
                this.ExpectNumCh = 0;
                for (int p = 0; p < 16; p++)
                {
                    if ((Convert.ToUInt16(Math.Pow(2, p)) & this.Mask) == Convert.ToUInt16(Math.Pow(2, p)))
                    {
                        this.ExpectNumCh = (UInt16)(this.ExpectNumCh + 4);
                    }
                }
                //board id 12,13
                i            = 12; t16 = 0;
                t16          = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.BoardID = t16;

                //spill status 14,15
                i   = 14; t16 = 0;
                t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                this.SpillStatus = t16;

                #endregion SpillHeader
                UInt32 event_num_left         = this.SpillTrigCount;
                bool   first_event_of_spill   = true;
                UInt16 ExpectedEventWordCount = 0;
                UInt32 StartPointer           = 0x10;
                UInt32 myTriggerCount         = 0;
                if (this.SpillTrigCount > MaxTrigPerSpill)
                {
                    if (PP.glbDebug)
                    {
                        Console.WriteLine("too many trig, I quit"); return(false);
                    }
                }

                i = 16;
                int      ch_num        = 0;
                DateTime start_parsing = DateTime.Now;

                mu2e_Event this_event = null;
                if (event_num_left > MaxTrigPerSpill)
                {
                    err = 10000; System.Windows.Forms.MessageBox.Show("Possible garbage read from WC Controller"); return(false);
                }
                while (event_num_left > 0)
                {
                    if (this_event == null)
                    {
                        this_event = new mu2e_Event();
                    }
                    #region EventHeader
                    //event word count
                    //i is 16 at this point for the first event
                    t16 = 0;


                    t16 = (UInt16)(pack[i] * 256 + pack[i + 1]);
                    this_event.EventWordCount = t16;
                    if (first_event_of_spill)
                    {
                        first_event_of_spill = false; ExpectedEventWordCount = t16;
                    }
                    else
                    {
                        UInt32 myPointer = 0;
                        if (this_event.ChNum > 0xf)
                        {
                            myPointer = StartPointer + (UInt32)(2 * ExpectedEventWordCount) * this.SpillTrigCount + (UInt32)(2 * ExpectedEventWordCount) * myTriggerCount;
                            i         = (int)myPointer;
                        }
                        else
                        {
                            myPointer = StartPointer + (UInt32)(2 * ExpectedEventWordCount) * myTriggerCount;
                            i         = (int)myPointer;

                            //for (int ii = 0; ii < 20; ii++)
                            //{
                            //    if (PP.glbDebug){ Console.Write(Convert.ToString((myPointer) + (32 * ii), 16) + "(" + (ii).ToString() + ") => ");
                            //    for (int jj = 0; jj < 16; jj++)
                            //    {
                            //        int this_index = (Int32)(myPointer) + (32 * ii) + jj * 2;
                            //        if (PP.glbDebug){ Console.Write(Convert.ToString(pack[this_index] * 256 + pack[this_index + 1], 16) + " ");
                            //    }
                            //    if (PP.glbDebug){ Console.WriteLine();
                            //}
                        }
                        if (PP.glbDebug)
                        {
                            Console.WriteLine("My pointer is =0x{0}", Convert.ToString(myPointer, 16));
                        }
                        if (PP.glbDebug)
                        {
                            Console.WriteLine("i={0},ThisEventWordCount={1}", Convert.ToString(i, 16), Convert.ToString(this_event.EventWordCount, 16));
                        }
                    }

                    i = i + 2;
                    //event time stamp
                    t32 = 0;
                    t32 = (UInt32)(pack[i++] * 256 * 256 * 256 + pack[i++] * 256 * 256 + pack[i++] * 256 + pack[i++]);
                    this_event.EventTimeStamp = t32;
                    //if (PP.glbDebug){ Console.WriteLine("time_stamp="+t32);}
                    //trigger counter
                    t32 = 0;
                    t32 = (UInt32)(pack[i++] * 256 * 256 * 256 + pack[i++] * 256 * 256 + pack[i++] * 256 + pack[i++]);
                    this_event.TrigCounter = t32;
                    if (PP.glbDebug)
                    {
                        Console.WriteLine("trig=" + t32);
                    }
                    //if (this_event.TrigCounter > 2000)
                    //{
                    //    System.IO.StreamWriter tw_bad_Evt = new System.IO.StreamWriter("c:\\data\\bad_evt" + PP.myRun.num + "_" + PP.Random_Number);
                    //    PP.Random_Number++;
                    //    tw_bad_Evt.WriteLine("Found bad event at"+ Convert.ToString((i-4), 16)+" with TrigCount="+ Convert.ToString(this_event.TrigCounter,16));
                    //    {
                    //        int bi = 0;
                    //        if (i > 128)
                    //        {
                    //            bi = i - 128;
                    //            string szbi = Convert.ToString(bi, 16);
                    //            char last_bi = szbi.Last<char>();
                    //            while (last_bi != '0')
                    //            {
                    //                bi++;
                    //                szbi = Convert.ToString(bi, 16);
                    //                last_bi = szbi.Last<char>();
                    //            }
                    //        }
                    //        else { bi = 0; }
                    //        for (int ii = 0; ii < 480; ii++)
                    //        {
                    //            tw_bad_Evt.Write(Convert.ToString((bi) + (32 * ii), 16) + "(" + (ii).ToString() + ") => ");
                    //            for (int jj = 0; jj < 16; jj++)
                    //            {
                    //                int this_index = (bi) + (32 * ii) + jj * 2;
                    //                tw_bad_Evt.Write(Convert.ToString(pack[this_index] * 256 + pack[this_index + 1], 16) + " ");
                    //            }
                    //            tw_bad_Evt.WriteLine();
                    //        }
                    //    }
                    //    tw_bad_Evt.Close();
                    //}
                    //event num samples
                    t16 = 0;
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.NumSamples = t16;

                    //event trig type
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.TrigType = t16;

                    //event stsus
                    t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                    this_event.EventStatus = t16;

                    #endregion EventHeader

                    #region EventData
                    if (this_event.NumSamples == 0)
                    {
                        if (PP.glbDebug)
                        {
                            Console.WriteLine("stop!");
                        }
                    }

                    int    num_ch = Convert.ToInt32(this_event.EventWordCount / this_event.NumSamples);
                    UInt16 ChNum  = 0;
                    if (this_event.ChNum > 0xf)
                    {
                        ChNum = 16;
                    }
                    for (int k = 0; k < num_ch; k++)   // num_chan == 0 (Corrado)
                    {
                        int[] ch_data = new int[this_event.NumSamples];
                        for (int j = 0; j < this_event.NumSamples; j++)
                        {
                            t16 = (UInt16)(pack[i++] * 256 + pack[i++]);
                            if ((t16 & 0x8000) == 0x8000)//ch_num
                            {
                                if (PP.glbDebug)
                                {
                                    Console.WriteLine(t16.ToString("x"));
                                }
                                t16   = (UInt16)(t16 & 0xfff);
                                ChNum = t16;
                                if (j != 0)
                                {
                                    if (PP.glbDebug)
                                    {
                                        Console.WriteLine("Chan in wrong spot!");
                                        Console.WriteLine("num_ch=" + num_ch.ToString());
                                    }
                                }
                            }
                            ch_data[j] = t16;
                            if (ch_data[j] > 0x7ff)
                            {
                                ch_data[j] = ch_data[j] - 0xfff;
                            }
                        }

                        mu2e_Ch this_ch = new mu2e_Ch();
                        this_event.ChNum++;
                        this_ch.data   = ch_data;
                        this_ch.num_ch = ChNum;
                        this_event.ChanData.Add(this_ch);
                    }


                    if (PP.glbDebug)
                    {
                        Console.WriteLine("end of event {0} at time {1}-----------------", this_event.TrigCounter, this_event.EventTimeStamp);
                    }

                    #endregion EventData
                    if (this_event.ChNum >= ExpectNumCh)
                    {
                        myTriggerCount++;
                        event_num_left--;
                        this.SpillEvents.AddLast(this_event);
                        this_event = null;
                    }
                }
                DateTime end_parsing   = DateTime.Now;
                TimeSpan time_to_parse = end_parsing.Subtract(start_parsing);
                if (PP.glbDebug)
                {
                    Console.WriteLine("Time to parse {0} events was {1} ms", this.SpillTrigCount, time_to_parse.TotalMilliseconds);
                }
                return(true);
            }
            catch (Exception e)
            {
                if (PP.glbDebug)
                {
                    Console.WriteLine("Caught exception " + e.Message + " in spill data");
                }
                return(false);
            }
        }