/data3/calcul/jacquem/working_dir/Micromegas/micromegasFrameWork/src/geometry/DiracChip.cpp

Go to the documentation of this file.
00001 /* @version $Revision: 1566 $ * @modifiedby $Author: jacquem $ * @lastmodified $Date: 2012-03-08 14:00:10 +0100 (Thu, 08 Mar 2012) $ */
00002 
00003 #include "geometry/DiracChip.hh"
00004 #include "geometry/DiracChannel.hh"
00005 
00006 #include <iostream>
00007 #include "tools/Log.hh"
00008 #include "mTypes.h"
00009 
00010 
00011 
00012 using namespace std;
00013 
00014 //--------------------------//
00015 DiracChip::DiracChip(const Board& aBoard, const i32 aCol, const i32 aRow, const ui32 nbColumns, const ui32 nbRows, const i32 aId,const ui32 aSerialNumber)
00016   :Chip(aBoard, aCol, aRow, nbColumns, nbRows, aId, aSerialNumber)
00017 {
00018 //  FILE_LOG(logDEBUG) << "---DiracChip constructor id " << id << endl;
00019   init();
00020   bLoThreshold = 0;
00021   bMidThreshold = 0;
00022   bHiThreshold = 0;
00023   aLoThreshold = 0;
00024   aMidThreshold = 0;
00025   aHiThreshold = 0;
00026 }; // DiracChip
00027 
00028 //--------------------------//
00029 void DiracChip::init()
00030 {
00031    for (int channelId = 0; channelId <= 63 ; channelId++) {
00032       int map = HRmap(channelId);
00033       DiracChannel *channel = new DiracChannel(*this, map%8, map/8, channelId);
00034       channels.insert(make_pair(channelId,channel));
00035     }
00036     bLoThreshold  = 0;
00037     bMidThreshold = 0;
00038     bHiThreshold  = 0;
00039     aLoThreshold  = 0;
00040     aMidThreshold = 0;
00041     aHiThreshold  = 0;
00042 }
00043 
00044 /*--------------- Channel MAPPING return position number   -------------
00045  *                result % 8 -> Column
00046  *                result / 8 -> row
00047  *
00048  */
00049 int DiracChip::HRmap(int channel)
00050 {
00051 
00052 
00053   if(channel<0||channel>63)
00054    {
00055      FILE_LOG(logERROR)<<"map error  channel="<<channel<<endl;return-1;
00056   }
00057 
00058   const int map[64]=
00059   {7, 6, 5, 4, 15,14,13,12,
00060    23,22,21,20,31,30,29,28,
00061    39,38,37,36,47,46,45,44,
00062    55,54,53,52,63,62,61,60,
00063    3 ,2 ,1 ,0, 11,10,9 ,8,
00064    19,18,17,16,27,26,25,24,
00065    35,34,33,32,43,42,41,40,
00066    51,50,49,48,59,58,57,56};
00067 
00068   return map[channel];
00069 
00070   return -1;
00071 }
00072 
00073 
00074 //--------------------------//
00075 DiracChip& DiracChip::operator = (const DiracChip& x) {
00076 
00077   FILE_LOG(logINFO) << "DiracChip& DiracChip::operator = (const DiracChip& x) " << endl;
00078   bLoThreshold  = x.bLoThreshold;
00079   bMidThreshold = x.bMidThreshold;
00080   bHiThreshold  = x.bHiThreshold;
00081   aLoThreshold  = x.aLoThreshold;
00082   aMidThreshold = x.aMidThreshold;
00083   aHiThreshold  = x.aHiThreshold;
00084 }
00085 
00086 
00087 //--------------------------//
00088 
00089 
00090 bool DiracChip::read(unsigned char *buf) {
00091   // get 23 bytes which are shifted by 4 bits...
00092   char dataBuf[256];
00093   char *dataStr = dataBuf;
00094   // split the string into correct data
00095   for (int dataNum = 0; dataNum < 23; dataNum++) {
00096     unsigned int data = *buf++;
00097     dataStr += sprintf(dataStr, "%02X", data);
00098   }
00099   *dataStr = 0;
00100   dataStr = dataBuf;
00101   unsigned int data;
00102 
00103   // 4-bit data
00104   sscanf(dataStr, "%1x", &data); dataStr++;
00105   gain = data & 0x03;
00106   analogData = (data & 0x08) != 0;
00107 
00108   // 3 thresholds for channels 32-63 (B-data), 8 bits each
00109   sscanf(dataStr, "%2x", &data); dataStr+=2;
00110   bHiThreshold = data;
00111   sscanf(dataStr, "%2x", &data); dataStr+=2;
00112   bMidThreshold = data;
00113   sscanf(dataStr, "%2x", &data); dataStr+=2;
00114   bLoThreshold = data;
00115   // configuration bits for 32 channels
00116   for (int bChNum = 63; bChNum >= 32; bChNum -= 4) {
00117     // 2 bits for each channel
00118     sscanf(dataStr, "%2x", &data); dataStr+=2;
00119     unsigned char mask = 0x80;
00120     for (int chNum = 0; chNum <= 3; chNum++) {
00121       //chConfig[bChNum - chNum].setStimulate((data & mask) != 0);
00122       this->getChannelById(bChNum - chNum).setStimulate((data & mask) != 0);
00123       mask >>= 1;
00124       //chConfig[bChNum - chNum].setEnable((data & mask) != 0);
00125       this->getChannelById(bChNum - chNum).setEnable((data & mask) != 0);
00126 
00127       mask >>= 1;
00128     }
00129   }
00130   // 3 thresholds for channels 31-0 (A-data), 8 bits each
00131   sscanf(dataStr, "%2x", &data); dataStr+=2;
00132   aHiThreshold = data;
00133   sscanf(dataStr, "%2x", &data); dataStr+=2;
00134   aMidThreshold = data;
00135   sscanf(dataStr, "%2x", &data); dataStr+=2;
00136   aLoThreshold = data;
00137   // configuration bits for 32 channels
00138   for (int aChNum = 31; aChNum >= 0; aChNum -= 4) {
00139     // 2 bits for each channel
00140     sscanf(dataStr, "%2x", &data); dataStr+=2;
00141     unsigned char mask = 0x80;
00142     for (int chNum = 0; chNum <= 3; chNum++) {
00143       //chConfig[aChNum - chNum].setStimulate((data & mask) != 0);
00144       this->getChannelById(aChNum - chNum).setStimulate((data & mask) != 0);
00145       mask >>= 1;
00146       //chConfig[aChNum - chNum].setEnable ((data & mask) != 0);
00147       this->getChannelById(aChNum - chNum).setEnable ((data & mask) != 0);
00148       mask >>= 1;
00149     }
00150   }
00151 
00152   FILE_LOG(logDEBUG1) << "  DiracChipConfig read" << endl;
00153   return(true);
00154 }; // DiracChip.read
00155 
00156 

Generated on Mon Jan 7 13:15:22 2013 for MicromegasFramework by  doxygen 1.4.7