CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes | Friends

DCUCCSDat Class Reference

#include <DCUCCSDat.h>

Inheritance diagram for DCUCCSDat:
IDataItem IDBObject

List of all members.

Public Member Functions

 DCUCCSDat ()
float getCCSTempHigh () const
float getCCSTempLow () const
float getM1DCUTemp () const
float getM1Vcc () const
float getM1VDD1 () const
float getM1VDD2 () const
float getM1Vinj () const
float getM2DCUTemp () const
float getM2Vcc () const
float getM2VDD1 () const
float getM2VDD2 () const
float getM2Vinj () const
std::string getTable ()
void setCCSTemp (float low, float high)
void setCCSTempHigh (float temp)
void setCCSTempLow (float temp)
void setDCUTemp (float t1, float t2)
void setM1 (float vdd1, float vdd2, float vinj, float vcc, float dcutemp)
void setM1DCUTemp (float temp)
void setM1Vcc (float temp)
void setM1VDD1 (float temp)
void setM1VDD2 (float temp)
void setM1Vinj (float temp)
void setM2 (float vdd1, float vdd2, float vinj, float vcc, float dcutemp)
void setM2DCUTemp (float temp)
void setM2Vcc (float temp)
void setM2VDD1 (float temp)
void setM2VDD2 (float temp)
void setM2Vinj (float temp)
void setVcc (float v1, float v2)
void setVDD (float m1vdd1, float m1vdd2, float m2vdd1, float m2vdd2)
void setVinj (float v1, float v2)
 ~DCUCCSDat ()

Private Member Functions

void fetchData (std::map< EcalLogicID, DCUCCSDat > *fillVec, DCUIOV *iov) throw (std::runtime_error)
void prepareWrite () throw (std::runtime_error)
void writeArrayDB (const std::map< EcalLogicID, DCUCCSDat > *data, DCUIOV *iov) throw (std::runtime_error)
void writeDB (const EcalLogicID *ecid, const DCUCCSDat *item, DCUIOV *iov) throw (std::runtime_error)

Private Attributes

float m_ccstemphigh
float m_ccstemplow
float m_m1_dcutemp
float m_m1_vcc
float m_m1_vdd1
float m_m1_vdd2
float m_m1_vinj
float m_m2_dcutemp
float m_m2_vcc
float m_m2_vdd1
float m_m2_vdd2
float m_m2_vinj

Friends

class EcalCondDBInterface

Detailed Description

Definition at line 12 of file DCUCCSDat.h.


Constructor & Destructor Documentation

DCUCCSDat::DCUCCSDat ( )

Definition at line 12 of file DCUCCSDat.cc.

References NULL.

DCUCCSDat::~DCUCCSDat ( )

Definition at line 33 of file DCUCCSDat.cc.

{
}

Member Function Documentation

void DCUCCSDat::fetchData ( std::map< EcalLogicID, DCUCCSDat > *  fillVec,
DCUIOV iov 
) throw (std::runtime_error) [private]

Definition at line 100 of file DCUCCSDat.cc.

References ExpressReco_HICollisions_FallBack::e, edm::pset::fillMap(), o2o::iov, L1TEmulatorMonitor_cff::p, setCCSTemp(), setDCUTemp(), setVcc(), setVDD(), and setVinj().

{
  this->checkConnection();
  fillMap->clear();

  iov->setConnection(m_env, m_conn);
  int iovID = iov->fetchID();
  if (!iovID) { 
    //  throw(std::runtime_error("DCUCCSDat::writeDB:  IOV not in DB")); 
    return;
  }

  try {

    m_readStmt->setSQL("SELECT cv.name, cv.logic_id, cv.id1, cv.id2, cv.id3, "
                       "cv.maps_to, "
                       "d.m1_vdd1, d.m2_vdd1, d.m1_vdd2, d.m2_vdd2, "
                       "d.m1_vinj, d.m2_vinj, "
                       "d.m1_vcc, d.m2_vcc, "
                       "d.m1_dcutemp, d.m2_dcutemp, "
                       "d.ccstemplow, d.ccstemphigh "
                       "FROM channelview cv JOIN dcu_ccs_dat d "
                       "ON cv.logic_id = d.logic_id AND cv.name = cv.maps_to "
                       "WHERE d.iov_id = :iov_id");
    m_readStmt->setInt(1, iovID);
    ResultSet* rset = m_readStmt->executeQuery();
    
    std::pair< EcalLogicID, DCUCCSDat > p;
    DCUCCSDat dat;
    while(rset->next()) {
      p.first = EcalLogicID( rset->getString(1),     // name
                             rset->getInt(2),        // logic_id
                             rset->getInt(3),        // id1
                             rset->getInt(4),        // id2
                             rset->getInt(5),        // id3
                             rset->getString(6));    // maps_to

      dat.setVDD(rset->getFloat(7), rset->getFloat(9), rset->getFloat(8),
                  rset->getFloat(10));
      dat.setVinj(rset->getFloat(11), rset->getFloat(12));
      dat.setVcc(rset->getFloat(13), rset->getFloat(14));
      dat.setDCUTemp(rset->getFloat(15), rset->getFloat(16));
      dat.setCCSTemp(rset->getFloat(17), rset->getFloat(18));
      p.second = dat;
      fillMap->insert(p);
    }
  } catch (SQLException &e) {
    throw(std::runtime_error("DCUCCSDat::fetchData():  "+e.getMessage()));
  }
}
float DCUCCSDat::getCCSTempHigh ( ) const [inline]

Definition at line 82 of file DCUCCSDat.h.

References m_ccstemphigh.

Referenced by writeArrayDB().

{ return m_ccstemphigh; }
float DCUCCSDat::getCCSTempLow ( ) const [inline]

Definition at line 81 of file DCUCCSDat.h.

References m_ccstemplow.

Referenced by writeArrayDB().

{ return m_ccstemplow; }
float DCUCCSDat::getM1DCUTemp ( ) const [inline]

Definition at line 79 of file DCUCCSDat.h.

References m_m1_dcutemp.

Referenced by writeArrayDB().

{ return m_m1_dcutemp; }
float DCUCCSDat::getM1Vcc ( ) const [inline]

Definition at line 77 of file DCUCCSDat.h.

References m_m1_vcc.

Referenced by writeArrayDB().

{ return m_m1_vcc; }
float DCUCCSDat::getM1VDD1 ( ) const [inline]

Definition at line 71 of file DCUCCSDat.h.

References m_m1_vdd1.

Referenced by writeArrayDB().

{ return m_m1_vdd1; }
float DCUCCSDat::getM1VDD2 ( ) const [inline]

Definition at line 72 of file DCUCCSDat.h.

References m_m1_vdd2.

Referenced by writeArrayDB().

{ return m_m1_vdd2; }
float DCUCCSDat::getM1Vinj ( ) const [inline]

Definition at line 75 of file DCUCCSDat.h.

References m_m1_vinj.

Referenced by writeArrayDB().

{ return m_m1_vinj; }
float DCUCCSDat::getM2DCUTemp ( ) const [inline]

Definition at line 80 of file DCUCCSDat.h.

References m_m2_dcutemp.

Referenced by writeArrayDB().

{ return m_m2_dcutemp; }
float DCUCCSDat::getM2Vcc ( ) const [inline]

Definition at line 78 of file DCUCCSDat.h.

References m_m2_vcc.

Referenced by writeArrayDB().

{ return m_m2_vcc; }
float DCUCCSDat::getM2VDD1 ( ) const [inline]

Definition at line 73 of file DCUCCSDat.h.

References m_m2_vdd1.

Referenced by writeArrayDB().

{ return m_m2_vdd1; }
float DCUCCSDat::getM2VDD2 ( ) const [inline]

Definition at line 74 of file DCUCCSDat.h.

References m_m2_vdd2.

Referenced by writeArrayDB().

{ return m_m2_vdd2; }
float DCUCCSDat::getM2Vinj ( ) const [inline]

Definition at line 76 of file DCUCCSDat.h.

References m_m2_vinj.

Referenced by writeArrayDB().

{ return m_m2_vinj; }
std::string DCUCCSDat::getTable ( ) [inline, virtual]

Implements IDataItem.

Definition at line 19 of file DCUCCSDat.h.

{ return "DCU_CCS_DAT"; }
void DCUCCSDat::prepareWrite ( ) throw (std::runtime_error) [private, virtual]

Implements IDataItem.

Definition at line 37 of file DCUCCSDat.cc.

References ExpressReco_HICollisions_FallBack::e.

{
  this->checkConnection();

  try {
    m_writeStmt = m_conn->createStatement();
    m_writeStmt->setSQL("INSERT INTO dcu_ccs_dat (iov_id, logic_id, "
                        "m1_vdd1, m2_vdd1, m1_vdd2, m2_vdd2, m1_vinj, "
                        "m2_vinj, m1_vcc, m2_vcc, m1_dcutemp, m2_dcutemp, "
                        "ccstemplow, ccstemphigh) "
                        "VALUES (:iov_id, :logic_id, "
                        ":m1_vdd1, :m2_vdd1, :m1_vdd2, :m2_vdd2, :m1_vinj, "
                        ":m2_vinj, :m1_vcc, :m2_vcc, :m1_dcutemp, "
                        ":m2_dcutemp, :ccstemplow, :ccstemphigh)");
  } catch (SQLException &e) {
    throw(std::runtime_error("DCUCCSDat::prepareWrite():  " + 
                             e.getMessage()));
  }
}
void DCUCCSDat::setCCSTemp ( float  low,
float  high 
) [inline]

Definition at line 51 of file DCUCCSDat.h.

References setCCSTempHigh(), and setCCSTempLow().

Referenced by fetchData().

                                                {
    setCCSTempLow(low);
    setCCSTempHigh(high);
  }
void DCUCCSDat::setCCSTempHigh ( float  temp) [inline]

Definition at line 50 of file DCUCCSDat.h.

References m_ccstemphigh, and cond::rpcobtemp::temp.

Referenced by setCCSTemp().

void DCUCCSDat::setCCSTempLow ( float  temp) [inline]

Definition at line 49 of file DCUCCSDat.h.

References m_ccstemplow, and cond::rpcobtemp::temp.

Referenced by setCCSTemp().

void DCUCCSDat::setDCUTemp ( float  t1,
float  t2 
) [inline]

Definition at line 45 of file DCUCCSDat.h.

References setM1DCUTemp(), and setM2DCUTemp().

Referenced by fetchData().

                                             {
    setM1DCUTemp(t1);
    setM2DCUTemp(t2);
  }
void DCUCCSDat::setM1 ( float  vdd1,
float  vdd2,
float  vinj,
float  vcc,
float  dcutemp 
) [inline]

Definition at line 55 of file DCUCCSDat.h.

References setM1DCUTemp(), setM1Vcc(), setM1VDD1(), setM1VDD2(), and setM1Vinj().

                                   {
    setM1VDD1(vdd1);
    setM1VDD2(vdd2);
    setM1Vinj(vinj);
    setM1Vcc(vcc);
    setM1DCUTemp(dcutemp);
  }
void DCUCCSDat::setM1DCUTemp ( float  temp) [inline]

Definition at line 43 of file DCUCCSDat.h.

References m_m1_dcutemp, and cond::rpcobtemp::temp.

Referenced by setDCUTemp(), and setM1().

void DCUCCSDat::setM1Vcc ( float  temp) [inline]

Definition at line 37 of file DCUCCSDat.h.

References m_m1_vcc, and cond::rpcobtemp::temp.

Referenced by setM1(), and setVcc().

{ m_m1_vcc = temp; }
void DCUCCSDat::setM1VDD1 ( float  temp) [inline]

Definition at line 21 of file DCUCCSDat.h.

References m_m1_vdd1, and cond::rpcobtemp::temp.

Referenced by setM1(), and setVDD().

{ m_m1_vdd1 = temp; }
void DCUCCSDat::setM1VDD2 ( float  temp) [inline]

Definition at line 23 of file DCUCCSDat.h.

References m_m1_vdd2, and cond::rpcobtemp::temp.

Referenced by setM1(), and setVDD().

{ m_m1_vdd2 = temp; }
void DCUCCSDat::setM1Vinj ( float  temp) [inline]

Definition at line 31 of file DCUCCSDat.h.

References m_m1_vinj, and cond::rpcobtemp::temp.

Referenced by setM1(), and setVinj().

{ m_m1_vinj = temp; }
void DCUCCSDat::setM2 ( float  vdd1,
float  vdd2,
float  vinj,
float  vcc,
float  dcutemp 
) [inline]

Definition at line 63 of file DCUCCSDat.h.

References setM2DCUTemp(), setM2Vcc(), setM2VDD1(), setM2VDD2(), and setM2Vinj().

                                   {
    setM2VDD1(vdd1);
    setM2VDD2(vdd2);
    setM2Vinj(vinj);
    setM2Vcc(vcc);
    setM2DCUTemp(dcutemp);
  }
void DCUCCSDat::setM2DCUTemp ( float  temp) [inline]

Definition at line 44 of file DCUCCSDat.h.

References m_m2_dcutemp, and cond::rpcobtemp::temp.

Referenced by setDCUTemp(), and setM2().

void DCUCCSDat::setM2Vcc ( float  temp) [inline]

Definition at line 38 of file DCUCCSDat.h.

References m_m2_vcc, and cond::rpcobtemp::temp.

Referenced by setM2(), and setVcc().

{ m_m2_vcc = temp; }
void DCUCCSDat::setM2VDD1 ( float  temp) [inline]

Definition at line 22 of file DCUCCSDat.h.

References m_m2_vdd1, and cond::rpcobtemp::temp.

Referenced by setM2(), and setVDD().

{ m_m2_vdd1 = temp; }
void DCUCCSDat::setM2VDD2 ( float  temp) [inline]

Definition at line 24 of file DCUCCSDat.h.

References m_m2_vdd2, and cond::rpcobtemp::temp.

Referenced by setM2(), and setVDD().

{ m_m2_vdd2 = temp; }
void DCUCCSDat::setM2Vinj ( float  temp) [inline]

Definition at line 32 of file DCUCCSDat.h.

References m_m2_vinj, and cond::rpcobtemp::temp.

Referenced by setM2(), and setVinj().

{ m_m2_vinj = temp; }
void DCUCCSDat::setVcc ( float  v1,
float  v2 
) [inline]

Definition at line 39 of file DCUCCSDat.h.

References setM1Vcc(), and setM2Vcc().

Referenced by fetchData().

                                         {
    setM1Vcc(v1);
    setM2Vcc(v2);
  }
void DCUCCSDat::setVDD ( float  m1vdd1,
float  m1vdd2,
float  m2vdd1,
float  m2vdd2 
) [inline]

Definition at line 25 of file DCUCCSDat.h.

References setM1VDD1(), setM1VDD2(), setM2VDD1(), and setM2VDD2().

Referenced by fetchData().

                                                                             {
    setM1VDD1(m1vdd1);
    setM1VDD2(m1vdd2);
    setM2VDD1(m2vdd1);
    setM2VDD2(m2vdd2);
  }
void DCUCCSDat::setVinj ( float  v1,
float  v2 
) [inline]

Definition at line 33 of file DCUCCSDat.h.

References setM1Vinj(), and setM2Vinj().

Referenced by fetchData().

                                          {
    setM1Vinj(v1);
    setM2Vinj(v2);
  }
void DCUCCSDat::writeArrayDB ( const std::map< EcalLogicID, DCUCCSDat > *  data,
DCUIOV iov 
) throw (std::runtime_error) [private]

Definition at line 153 of file DCUCCSDat.cc.

References prof2calltree::count, runTheMatrix::data, ExpressReco_HICollisions_FallBack::e, getCCSTempHigh(), getCCSTempLow(), EcalLogicID::getLogicID(), getM1DCUTemp(), getM1Vcc(), getM1VDD1(), getM1VDD2(), getM1Vinj(), getM2DCUTemp(), getM2Vcc(), getM2VDD1(), getM2VDD2(), getM2Vinj(), o2o::iov, and L1TEmulatorMonitor_cff::p.

{
  this->checkConnection();
  this->checkPrepare();

  int iovID = iov->fetchID();
  if (!iovID) { 
    throw(std::runtime_error("DCUCCSDat::writeArrayDB:  IOV not in DB")); 
  }

  int nrows=data->size(); 
  int* ids= new int[nrows];
  int* iovid_vec= new int[nrows];
  float* x1= new float[nrows];
  float* x2= new float[nrows];
  float* x3= new float[nrows];
  float* x4= new float[nrows];
  float* x5= new float[nrows];
  float* x6= new float[nrows];
  float* x7= new float[nrows];
  float* x8= new float[nrows];
  float* x9= new float[nrows];
  float* xa= new float[nrows];
  float* xb= new float[nrows];
  float* xc= new float[nrows];

  ub2* ids_len= new ub2[nrows];
  ub2* iov_len= new ub2[nrows];
  ub2* x_len  = new ub2[nrows];

  const EcalLogicID* channel;
  const DCUCCSDat* dataitem;
  int count=0;
  typedef map< EcalLogicID, DCUCCSDat >::const_iterator CI;
  for (CI p = data->begin(); p != data->end(); ++p) {
        channel = &(p->first);
        int logicID = channel->getLogicID();
        if (!logicID) { 
          throw(std::runtime_error("DCUCCSDat::writeArrayDB:  Bad EcalLogicID")); 
        }
        ids[count]=logicID;
        iovid_vec[count]=iovID;
        
        dataitem = &(p->second);

        x1[count] = dataitem->getM1VDD1();
        x2[count] = dataitem->getM2VDD1();
        x3[count] = dataitem->getM1VDD2();
        x4[count] = dataitem->getM2VDD2();
        x5[count] = dataitem->getM1Vinj();
        x6[count] = dataitem->getM2Vinj();
        x7[count] = dataitem->getM1Vcc();
        x8[count] = dataitem->getM2Vcc();
        x9[count] = dataitem->getM1DCUTemp();
        xa[count] = dataitem->getM2DCUTemp();
        xb[count] = dataitem->getCCSTempLow();
        xc[count] = dataitem->getCCSTempHigh();

        ids_len[count]=sizeof(ids[count]);
        iov_len[count]=sizeof(iovid_vec[count]);
        
        x_len[count]=sizeof(x1[count]);

        count++;
     }


  try {
    m_writeStmt->setDataBuffer(1, (dvoid*)iovid_vec, OCCIINT, 
                               sizeof(iovid_vec[0]),iov_len);
    m_writeStmt->setDataBuffer(2, (dvoid*)ids, OCCIINT, 
                               sizeof(ids[0]), ids_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x1, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x2, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x3, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x4, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x5, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x6, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x7, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x8, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)x9, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)xa, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)xb, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
    m_writeStmt->setDataBuffer(3, (dvoid*)xc, OCCIFLOAT , 
                               sizeof(x1[0]), x_len );
   
    m_writeStmt->executeArrayUpdate(nrows);

    delete [] ids;
    delete [] iovid_vec;
    delete [] x1;
    delete [] x2;
    delete [] x3;
    delete [] x4;
    delete [] x5;
    delete [] x6;
    delete [] x7;
    delete [] x8;
    delete [] x9;
    delete [] xa;
    delete [] xb;
    delete [] xc;

    delete [] ids_len;
    delete [] iov_len;
    delete [] x_len;


  } catch (SQLException &e) {
    throw(std::runtime_error("DCUCCSDat::writeArrayDB():  " + e.getMessage()));
  }
}
void DCUCCSDat::writeDB ( const EcalLogicID ecid,
const DCUCCSDat item,
DCUIOV iov 
) throw (std::runtime_error) [private]

Definition at line 60 of file DCUCCSDat.cc.

References ExpressReco_HICollisions_FallBack::e, and o2o::iov.

{
  this->checkConnection();
  this->checkPrepare();

  int iovID = iov->fetchID();
  if (!iovID) { 
    throw(std::runtime_error("DCUCCSDat::writeDB:  IOV not in DB")); 
  }

  int logicID = ecid->getLogicID();
  if (!logicID) { 
    throw(std::runtime_error("DCUCCSDat::writeDB:  Bad EcalLogicID")); 
  }
  
  try {
    m_writeStmt->setInt(1, iovID);
    m_writeStmt->setInt(2, logicID);

    m_writeStmt->setFloat( 3, item->getM1VDD1() );
    m_writeStmt->setFloat( 4, item->getM2VDD1() );
    m_writeStmt->setFloat( 5, item->getM1VDD2() );
    m_writeStmt->setFloat( 6, item->getM2VDD2() );
    m_writeStmt->setFloat( 7, item->getM1Vinj() );
    m_writeStmt->setFloat( 8, item->getM2Vinj() );
    m_writeStmt->setFloat( 9, item->getM1Vcc() );
    m_writeStmt->setFloat(10, item->getM2Vcc() );
    m_writeStmt->setFloat(11, item->getM1DCUTemp() );
    m_writeStmt->setFloat(12, item->getM2DCUTemp() );
    m_writeStmt->setFloat(13, item->getCCSTempLow() );
    m_writeStmt->setFloat(14, item->getCCSTempHigh() );

    m_writeStmt->executeUpdate();
  } catch (SQLException &e) {
    throw(std::runtime_error("DCUCCSDat::writeDB():  " + e.getMessage()));
  }
}

Friends And Related Function Documentation

friend class EcalCondDBInterface [friend]

Reimplemented from IDBObject.

Definition at line 14 of file DCUCCSDat.h.


Member Data Documentation

float DCUCCSDat::m_ccstemphigh [private]

Definition at line 109 of file DCUCCSDat.h.

Referenced by getCCSTempHigh(), and setCCSTempHigh().

float DCUCCSDat::m_ccstemplow [private]

Definition at line 108 of file DCUCCSDat.h.

Referenced by getCCSTempLow(), and setCCSTempLow().

float DCUCCSDat::m_m1_dcutemp [private]

Definition at line 106 of file DCUCCSDat.h.

Referenced by getM1DCUTemp(), and setM1DCUTemp().

float DCUCCSDat::m_m1_vcc [private]

Definition at line 104 of file DCUCCSDat.h.

Referenced by getM1Vcc(), and setM1Vcc().

float DCUCCSDat::m_m1_vdd1 [private]

Definition at line 98 of file DCUCCSDat.h.

Referenced by getM1VDD1(), and setM1VDD1().

float DCUCCSDat::m_m1_vdd2 [private]

Definition at line 100 of file DCUCCSDat.h.

Referenced by getM1VDD2(), and setM1VDD2().

float DCUCCSDat::m_m1_vinj [private]

Definition at line 102 of file DCUCCSDat.h.

Referenced by getM1Vinj(), and setM1Vinj().

float DCUCCSDat::m_m2_dcutemp [private]

Definition at line 107 of file DCUCCSDat.h.

Referenced by getM2DCUTemp(), and setM2DCUTemp().

float DCUCCSDat::m_m2_vcc [private]

Definition at line 105 of file DCUCCSDat.h.

Referenced by getM2Vcc(), and setM2Vcc().

float DCUCCSDat::m_m2_vdd1 [private]

Definition at line 99 of file DCUCCSDat.h.

Referenced by getM2VDD1(), and setM2VDD1().

float DCUCCSDat::m_m2_vdd2 [private]

Definition at line 101 of file DCUCCSDat.h.

Referenced by getM2VDD2(), and setM2VDD2().

float DCUCCSDat::m_m2_vinj [private]

Definition at line 103 of file DCUCCSDat.h.

Referenced by getM2Vinj(), and setM2Vinj().