Changeset 490 in Sophya for trunk/SophyaLib/NTools/ntuple.cc


Ignore:
Timestamp:
Oct 21, 1999, 5:25:53 PM (26 years ago)
Author:
ansari
Message:

Merge avec PEIDA++ (~V 3.8) et nettoyage pour nouveau PPersist Reza+cmv 21/10/99

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/ntuple.cc

    r475 r490  
    22#include <string.h>
    33
     4#include "strutil.h"
    45#include "perrors.h"
    56#include "ntuple.h"
     
    1617//
    1718//      Classe de ntuples
     19//--
     20//++
     21// Links        Parents
     22// PPersist
     23// NTupleInterface
    1824//--
    1925
     
    3541//++
    3642NTuple::NTuple(int nvar, char** noms, int blk)
    37   //
    38   //    Createur d'un ntuple de `nvar' variables dont les
    39   //    noms sont dans le tableau de cahines de caracteres `noms'
    40   //    avec `blk' d'evenements par blocks.
    41 //--
    42 {
    43   mNVar = mNEnt = mBlk = mNBlk = 0;
    44   mVar = NULL;
    45   mVarD = NULL;
    46   mNames = NULL;
    47   mInfo = NULL;
    48   if (nvar <= 0)  THROW(sizeMismatchErr);
    49   mNVar = nvar;
    50   mVar = new r_4[nvar];
    51   mVarD = new r_8[nvar];
    52   if (blk < 10) blk = 10;
    53   mBlk = blk;
    54   // On prend des noms de LENNAME char pour le moment
    55   mNames = new char[nvar*LENNAME1];
    56   r_4* pt = new r_4[nvar*blk];
    57   mNBlk = 1;
    58   mPtr.push_back(pt);
    59   int i;
    60   for(i=0; i<nvar; i++)
    61     {
    62       strncpy(mNames+i*LENNAME1, noms[i], LENNAME); 
    63       mNames[i*LENNAME1+LENNAME] = '\0';
    64     }
    65   return;
     43//
     44//      Createur d'un ntuple de `nvar' variables dont les
     45//      noms sont dans le tableau de cahines de caracteres `noms'
     46//      avec `blk' d'evenements par blocks.
     47//--
     48{
     49mNVar = mNEnt = mBlk = mNBlk = 0;
     50mVar = NULL;
     51mVarD = NULL;
     52mNames = NULL;
     53mInfo = NULL;
     54if (nvar <= 0)  THROW(sizeMismatchErr);
     55mNVar = nvar;
     56mVar = new r_4[nvar];
     57mVarD = new r_8[nvar];
     58if (blk < 10) blk = 10;
     59mBlk = blk;
     60// On prend des noms de LENNAME char pour le moment
     61mNames = new char[nvar*LENNAME1];
     62r_4* pt = new r_4[nvar*blk];
     63mNBlk = 1;
     64mPtr.push_back(pt);
     65int i;
     66for(i=0; i<nvar; i++)
     67  { strncpy(mNames+i*LENNAME1, noms[i], LENNAME); 
     68  mNames[i*LENNAME1+LENNAME] = '\0'; }
     69return;
     70}
     71
     72//                                       cmv 8/10/99
     73//++
     74NTuple::NTuple(const NTuple& NT)
     75//
     76//      Createur par copie (clone).
     77//--
     78: mNVar(0), mNEnt(0), mBlk(0), mNBlk(0)
     79, mVar(NULL), mVarD(NULL), mNames(NULL), mInfo(NULL)
     80{
     81if(NT.mNVar<=0) return; // cas ou NT est cree par defaut
     82mNVar = NT.mNVar;
     83mBlk = NT.mBlk;
     84mVar = new r_4[NT.mNVar];
     85mVarD = new r_8[NT.mNVar];
     86mNames = new char[NT.mNVar*LENNAME1];
     87
     88int i;
     89r_4* pt = new r_4[mNVar*mBlk];
     90mNBlk = 1; mPtr.push_back(pt);
     91
     92for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i));
     93
     94if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
     95
     96if(NT.mNEnt<=0) return;
     97for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
     98
     99return;
    66100}
    67101
     
    79113mInfo = NULL;
    80114PInPersist s(flnm);
    81 Read(s);
     115ObjFileIO<NTuple> fiont(this);
     116fiont.Read(s);
    82117}
    83118
     
    96131if (mInfo) delete mInfo;
    97132int i;
    98 for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
     133if(mNBlk>0) for(i=0; i<mNBlk; i++)  delete[] mPtr[i];
    99134mPtr.erase(mPtr.begin(), mPtr.end());
    100135mNVar = mNEnt = mBlk = mNBlk = 0;
     
    102137mVarD = NULL;
    103138mNames = NULL;
     139mInfo = NULL;
    104140return;
     141}
     142
     143/* --Methode--        cmv 08/10/99 */
     144//++
     145NTuple& NTuple::operator = (const NTuple& NT)
     146//
     147//      Operateur egal (clone).
     148//--
     149{
     150if(this == &NT) return *this;
     151Clean();
     152if(NT.mNVar<=0) return *this; // cas ou NT est cree par defaut
     153mNVar = NT.mNVar;
     154mBlk = NT.mBlk;
     155mVar = new r_4[NT.mNVar];
     156mVarD = new r_8[NT.mNVar];
     157mNames = new char[NT.mNVar*LENNAME1];
     158
     159int i;
     160r_4* pt = new r_4[mNVar*mBlk];
     161mNBlk = 1; mPtr.push_back(pt);
     162
     163for(i=0;i<mNVar;i++) strcpy(mNames+i*LENNAME1,NT.NomIndex(i));
     164
     165if(NT.mInfo!=NULL) {mInfo = new DVList; *mInfo = *(NT.mInfo);}
     166
     167if(NT.mNEnt<=0) return *this;
     168for(i=0;i<NT.mNEnt;i++) {r_4* x=NT.GetVec(i,NULL); Fill(x);}
     169
     170// En fait il faudrait un createur par copie qui partage les donnees
     171// quand l'objet est temporaire... trop complique A FAIRE !  cmv.
     172return *this;
    105173}
    106174
     
    167235}
    168236
    169 /* --Methode-- */
    170 //++
    171 string NTuple::VarList_C(const char* nomx)  const
    172 //
    173 //      Retourne une chaine de caracteres avec la declaration des noms de
    174 //      variables. si "nomx!=NULL" , des instructions d'affectation
    175 //      a partir d'un tableau "nomx[i]" sont ajoutees.
    176 //--
    177 {
    178 string rets;
    179 int i;
    180 for(i=0; i<mNVar; i++) {
    181   if ( (i%5 == 0) && (i > 0) )  rets += ";"; 
    182   if (i%5 == 0)   rets += "\ndouble ";
    183   else rets += ",";
    184   rets += mNames+i*LENNAME1;
    185   }
    186 rets += "; \n";
    187 if (nomx) {
    188   char buff[256];
    189   for(i=0; i<mNVar; i++) {
    190     sprintf(buff,"%s=%s[%d]; ",  mNames+i*LENNAME1, nomx, i);
    191     rets += buff;
    192     if ( (i%3 == 0) && (i > 0) )  rets += "\n";
    193     }
    194   }
    195 
    196 return(rets);
    197 }
    198237 
    199238/* --Methode-- */
     
    231270}
    232271
    233 /* --Methode-- */
    234 //++
    235 void  NTuple::GetMinMax(int k, float& min, float& max)  const
     272
     273
     274/* --Methode-- */
     275//++
     276DVList&  NTuple::Info()
     277//
     278//      Renvoie une référence sur l'objet DVList Associé
     279//--
     280{
     281if (mInfo == NULL)  mInfo = new DVList;
     282return(*mInfo);
     283}
     284
     285/* --Methode-- */
     286//++
     287void  NTuple::Print(int num, int nmax)  const
     288//
     289//      Imprime `nmax' evenements a partir du numero `num'.
     290//--
     291{
     292int i,j;
     293
     294printf("Num     ");
     295for(i=0; i<mNVar; i++)  printf("%8s ", mNames+i*LENNAME1);
     296putchar('\n');
     297
     298if (nmax <= 0)  nmax = 1;
     299if (num < 0)  num = 0;
     300nmax += num;
     301if (nmax > mNEnt) nmax = mNEnt;
     302for(i=num; i<nmax; i++) {
     303  GetVec(i, NULL);
     304  printf("%6d  ", i); 
     305  for(j=0; j<mNVar; j++)  printf("%8g ", (float)mVar[j]);
     306  putchar('\n');
     307}
     308return;
     309}
     310
     311/* --Methode-- */
     312//++
     313void  NTuple::Show(ostream& os)  const
     314//
     315//      Imprime l'information generale sur le ntuple.
     316//--
     317{
     318os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 
     319   << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
     320os << "            Variables       Min      Max       \n";
     321int i;
     322double min, max;
     323char buff[128];
     324for(i=0; i<mNVar; i++) {
     325  GetMinMax(i, min, max);
     326  sprintf(buff, "%3d  %16s  %10lg  %10lg \n", i, mNames+i*LENNAME1, min, max);
     327  os << (string)buff ;
     328  }
     329os << endl;
     330}
     331
     332
     333/* --Methode-- */
     334//++
     335int  NTuple::FillFromASCIIFile(string const& fn, float defval)
     336//
     337//      Remplit le ntuple a partir d'un fichier ASCII.
     338//      Renvoie le nombre de lignes ajoutees.
     339//--
     340{
     341if (NbColumns() < 1)  {
     342  cout << "NTuple::FillFromASCIIFile() Ntuple has " << NbColumns() << " columns" << endl;
     343  return(-1);
     344  }
     345FILE * fip = fopen(fn.c_str(), "r");
     346if (fip == NULL) {
     347  cout << "NTuple::FillFromASCIIFile() Error opening file " << fn << endl;
     348  return(-2);
     349  }
     350
     351char lineb[4096];
     352char *line;
     353char buff[64];
     354char* ccp;
     355int i,j,l,kk;
     356int postab, posb;
     357float* xv = new float[NbColumns()];
     358
     359int nlread = 0;
     360int nvar = NbColumns();
     361// On boucle sur toutes les lignes
     362while (fgets(lineb,4096,fip) != NULL) {
     363  lineb[4095] = '\0';
     364  j = 0; line = lineb;
     365//  On enleve les espaces et tab de debut
     366  while ( (line[j] != '\0') && ((line[j] == ' ') || (line[j] == '\t')) )  j++;
     367  line = lineb+j;
     368// Il faut que le premier caractere non-espace soit un digit, ou + ou - ou .
     369  if (!( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') ))  continue;
     370  ccp = line;
     371  for(kk=0; kk<nvar; kk++)  xv[kk] = defval;
     372  for(kk=0; kk<nvar; kk++) {
     373// Les mots sont separes par des espaces ou des tab
     374    postab = posc(ccp, '\t' );
     375    posb = posc(ccp, ' ' );
     376    if (postab >= 0) {
     377       if (posb < 0) posb = postab;
     378       else if (postab < posb)  posb = postab;
     379       }
     380    if (posb >= 0)  ccp[posb] = '\0';
     381    if ( isdigit(line[0]) || (line[0] == '+') || (line[0] == '-') || (line[0] == '.') )
     382      xv[kk] = atof(ccp);
     383    if (posb < 0)  break;
     384    ccp += posb+1;   j = 0;
     385    while ( (ccp[j] != '\0') && ((ccp[j] == ' ') || (ccp[j] == '\t')) )  j++;
     386    ccp += j;
     387    }
     388  Fill(xv);
     389  nlread++;
     390  }
     391
     392delete[] xv;
     393cout << "NTuple::FillFromASCIIFile( " << fn << ") " << nlread << " fill from file " << endl;
     394return(nlread);
     395}
     396
     397
     398// ------- Implementation de  l interface NTuple  ---------
     399
     400/* --Methode-- */
     401uint_4 NTuple::NbLines() const
     402{
     403return(NEntry());
     404}
     405/* --Methode-- */
     406uint_4 NTuple::NbColumns() const
     407{
     408return(NVar());
     409}
     410
     411/* --Methode-- */
     412r_8 * NTuple::GetLineD(int n) const
     413{
     414return(GetVecD(n));
     415}
     416
     417/* --Methode-- */
     418r_8 NTuple::GetCell(int n, int k) const
     419{
     420return(GetVal(n, k));
     421}
     422
     423/* --Methode-- */
     424r_8 NTuple::GetCell(int n, string const & nom) const
     425{
     426return(GetVal(n, nom.c_str()));
     427}
     428
     429/* --Methode-- */
     430//++
     431void  NTuple::GetMinMax(int k, double& min, double& max)  const
    236432//
    237433//      Retourne le minimum et le maximum de la variable `k'.
     
    241437if ( (k < 0) || (k >= mNVar) )    return;
    242438int jb,ib,i;
    243 float x;
     439double x;
    244440i=0;
    245441for(jb=0; jb< mNBlk; jb++)
     
    256452
    257453/* --Methode-- */
    258 //++
    259 DVList&  NTuple::Info()
    260 //
    261 //      Renvoie une référence sur l'objet DVList Associé
    262 //--
    263 {
    264 if (mInfo == NULL)  mInfo = new DVList;
    265 return(*mInfo);
    266 }
    267 
    268 /* --Methode-- */
    269 //++
    270 void  NTuple::Print(int num, int nmax)  const
    271 //
    272 //      Imprime `nmax' evenements a partir du numero `num'.
    273 //--
    274 {
    275 int i,j;
    276 
    277 printf("Num     ");
    278 for(i=0; i<mNVar; i++)  printf("%8s ", mNames+i*LENNAME1);
    279 putchar('\n');
    280 
    281 if (nmax <= 0)  nmax = 1;
    282 if (num < 0)  num = 0;
    283 nmax += num;
    284 if (nmax > mNEnt) nmax = mNEnt;
    285 for(i=num; i<nmax; i++) {
    286   GetVec(i, NULL);
    287   printf("%6d  ", i); 
    288   for(j=0; j<mNVar; j++)  printf("%8g ", (float)mVar[j]);
    289   putchar('\n');
    290 }
     454void NTuple::GetMinMax(string const & nom, double& min, double& max)   const
     455{
     456GetMinMax(IndexNom(nom.c_str()), min, max);
     457}
     458
     459/* --Methode-- */
     460int NTuple::ColumnIndex(string const & nom)  const
     461{
     462return(IndexNom(nom.c_str()));
     463}
     464
     465/* --Methode-- */
     466string NTuple::ColumnName(int k) const
     467{
     468return(NomIndex(k));
     469}
     470
     471/* --Methode-- */
     472//++
     473string NTuple::VarList_C(const char* nomx)  const
     474//
     475//      Retourne une chaine de caracteres avec la declaration des noms de
     476//      variables. si "nomx!=NULL" , des instructions d'affectation
     477//      a partir d'un tableau "nomx[i]" sont ajoutees.
     478//--
     479{
     480string rets="";
     481int i;
     482for(i=0; i<mNVar; i++) {
     483  if ( (i%5 == 0) && (i > 0) )  rets += ";"; 
     484  if (i%5 == 0)   rets += "\ndouble ";
     485  else rets += ",";
     486  rets += mNames+i*LENNAME1;
     487  }
     488rets += "; \n";
     489if (nomx) {
     490  char buff[256];
     491  for(i=0; i<mNVar; i++) {
     492    sprintf(buff,"%s=%s[%d]; ",  mNames+i*LENNAME1, nomx, i);
     493    rets += buff;
     494    if ( (i%3 == 0) && (i > 0) )  rets += "\n";
     495    }
     496  }
     497
     498return(rets);
     499}
     500
     501
     502/* --Methode-- */
     503//++
     504string NTuple::LineHeaderToString() const
     505//      Retourne une chaine de caracteres avec la liste des noms de 
     506//      variables, utilisables pour une impression
     507//--
     508{
     509char buff[32];
     510string rets=" Num    ";
     511for(int i=0; i<mNVar; i++) {
     512  sprintf(buff, "%8s ", mNames+i*LENNAME1);
     513  rets += buff;
     514  }
     515rets += '\n';
     516return(rets);
     517}
     518
     519/* --Methode-- */
     520//++
     521string NTuple::LineToString(int n) const
     522//      Retourne une chaine de caracteres avec le contenu de la ligne "n"
     523//      utilisable pour une impression
     524//--
     525{
     526char buff[32];
     527double* val;
     528val = GetLineD(n);
     529sprintf(buff,"%6d: ",n); 
     530string rets=buff;
     531int i;
     532for(i=0; i<mNVar; i++) {
     533  sprintf(buff, "%8.3g ", val[i]);
     534  rets += buff;
     535  }
     536rets += '\n';
     537return(rets);
     538}
     539
     540
     541/* --Methode-- */
     542//++
     543void   ObjFileIO<NTuple>::WriteSelf(POutPersist& s)  const
     544//
     545//      Ecriture ppersist du ntuple.
     546//--
     547{
     548char strg[256];
     549if (dobj->mInfo)  sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d  HasInfo",
     550                          (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk);
     551else sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d ",
     552                   (int)dobj->mNVar, (int)dobj->mNEnt, (int)dobj->mBlk, (int)dobj->mNBlk);
     553s.PutLine(strg);
     554s.PutI4(dobj->mNVar);
     555s.PutBytes(dobj->mNames, dobj->mNVar*LENNAME1);
     556s.PutI4(dobj->mNEnt);
     557s.PutI4(dobj->mBlk);
     558s.PutI4(dobj->mNBlk);
     559if (dobj->mInfo)  s << (*(dobj->mInfo));
     560int jb;
     561for(jb=0; jb<dobj->mNBlk; jb++)
     562  s.PutR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
    291563return;
    292564}
     
    294566/* --Methode-- */
    295567//++
    296 void  NTuple::Show(ostream& os)  const
    297 //
    298 //      Imprime l'information generale sur le ntuple.
    299 //--
    300 {
    301 os << "NTuple: NVar= " << mNVar << " NEnt=" << mNEnt 
    302    << " (Blk Sz,Nb= " << mBlk << " ," << mNBlk << ")\n";
    303 os << "            Variables       Min      Max       \n";
    304 int i;
    305 float min, max;
    306 char buff[128];
    307 for(i=0; i<mNVar; i++) {
    308   GetMinMax(i, min, max);
    309   sprintf(buff, "%3d  %16s  %10g  %10g \n", i, mNames+i*LENNAME1, min, max);
    310   os << (string)buff ;
    311   }
    312 os << endl;
    313 }
    314 
    315 
    316 /* --Methode-- */
    317 //++
    318 void  NTuple::WriteSelf(POutPersist& s)  const
    319 //
    320 //      Ecriture ppersist du ntuple.
    321 //--
    322 {
     568void  ObjFileIO<NTuple>::ReadSelf(PInPersist& s)
     569//
     570//      Lecture ppersist du ntuple.
     571//--
     572{
     573
     574dobj->Clean();
     575
    323576char strg[256];
    324 if (mInfo)  sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d  HasInfo",
    325                           (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
    326 else sprintf(strg, "NVar=%6d  NEnt=%9d  BlkSz=%6d NBlk=%6d ",
    327                    (int)mNVar, (int)mNEnt, (int)mBlk, (int)mNBlk);
    328 s.PutLine(strg);
    329 s.PutI4(mNVar);
    330 s.PutBytes(mNames, mNVar*LENNAME1);
    331 s.PutI4(mNEnt);
    332 s.PutI4(mBlk);
    333 s.PutI4(mNBlk);
    334 if (mInfo)  s << (*mInfo);
    335 int jb;
    336 for(jb=0; jb<mNBlk; jb++)
    337   s.PutR4s(mPtr[jb], mNVar*mBlk);
    338 return;
    339 }
    340 
    341 /* --Methode-- */
    342 //++
    343 void  NTuple::ReadSelf(PInPersist& s)
    344 //
    345 //      Lecture ppersist du ntuple.
    346 //--
    347 {
    348 
    349   Clean();
    350  
    351   char strg[256];
    352   s.GetLine(strg, 255);
    353   // Pour savoir s'il y avait un DVList Info associe
    354   bool hadinfo = false;
    355   if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
    356 
    357   s.GetI4(mNVar);
    358   mNames = new char[mNVar*LENNAME1];
    359   mVar = new r_4[mNVar];
    360   mVarD = new r_8[mNVar];
    361   s.GetBytes(mNames, mNVar*LENNAME1);
    362   s.GetI4(mNEnt);
    363   s.GetI4(mBlk);
    364   s.GetI4(mNBlk);
    365 
    366   if (hadinfo) {    // Lecture eventuelle du DVList Info
    367     if (mInfo == NULL)  mInfo = new DVList;
    368     s >> (*mInfo);
    369   }
    370 
    371   int jb;
    372   for(jb=0; jb<mNBlk; jb++) {
    373     r_4* pt = new r_4[mNVar*mBlk];
    374     mPtr.push_back(pt);
    375     s.GetR4s(mPtr[jb], mNVar*mBlk);
    376   }
    377 }
    378 
    379 NTuple& NTuple::operator=(const NTuple &ntpl)
    380 {
    381   mNVar= ntpl.mNVar;
    382   mNEnt= ntpl.mNEnt;
    383   mBlk = ntpl.mBlk;
    384   mNBlk= ntpl.mNBlk;
    385  
    386   mVar= new r_4[mNVar];
    387   for(int k = 0; k < mNVar; k++)
    388     mVar[k]= ntpl.mVar[k];
    389  
    390   mVarD= new r_8[mNVar];
    391   for(int k = 0; k < mNVar; k++)
    392     mVarD[k]= ntpl.mVarD[k];
    393  
    394   mNames = new char[mNVar*LENNAME1];
    395   for(int i = 0; i < mNVar; i++)
    396     {
    397       strncpy(mNames+i*LENNAME1,(ntpl.mNames)+i*LENNAME1, LENNAME); 
    398       mNames[i*LENNAME1+LENNAME] = '\0';
    399     }
    400 
    401   for(int k = 0; k < mNBlk; k++)
    402     {
    403       r_4 *ptr= new r_4[mNVar*mBlk];
    404       for(int i = 0; i < mNVar*mBlk; i++)
    405         {
    406           *(ptr+i)= *(ntpl.mPtr[k]+i);
    407         }
    408       mPtr.push_back(ptr);
    409     }
    410 
    411   mInfo = new DVList;
    412   if(ntpl.mInfo) 
    413     {
    414       *mInfo= *(ntpl.mInfo);
    415     }
    416   else
    417     {
    418       mInfo = NULL;
    419     }
    420 
    421   return *this;
    422 }
     577s.GetLine(strg, 255);
     578// Pour savoir s'il y avait un DVList Info associe
     579bool hadinfo = false;
     580if (strncmp(strg+strlen(strg)-7, "HasInfo", 7) == 0)  hadinfo = true;
     581
     582s.GetI4(dobj->mNVar);
     583dobj->mNames = new char[dobj->mNVar*LENNAME1];
     584dobj->mVar = new r_4[dobj->mNVar];
     585dobj->mVarD = new r_8[dobj->mNVar];
     586s.GetBytes(dobj->mNames, dobj->mNVar*LENNAME1);
     587s.GetI4(dobj->mNEnt);
     588s.GetI4(dobj->mBlk);
     589s.GetI4(dobj->mNBlk);
     590
     591if (hadinfo) {    // Lecture eventuelle du DVList Info
     592  if (dobj->mInfo == NULL)  dobj->mInfo = new DVList;
     593  s >> (*(dobj->mInfo));
     594  }
     595
     596int jb;
     597for(jb=0; jb<dobj->mNBlk; jb++) {
     598  r_4* pt = new r_4[dobj->mNVar*dobj->mBlk];
     599  dobj->mPtr.push_back(pt);
     600  s.GetR4s(dobj->mPtr[jb], dobj->mNVar*dobj->mBlk);
     601}
     602
     603}
     604
     605#ifdef __CXX_PRAGMA_TEMPLATES__
     606#pragma define_template ObjFileIO<NTuple>
     607#endif
     608
     609#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
     610template class ObjFileIO<NTuple>;
     611#endif
Note: See TracChangeset for help on using the changeset viewer.