/[PAMELA software]/DarthVader/RunInfo/src/RunInfo.cpp
ViewVC logotype

Diff of /DarthVader/RunInfo/src/RunInfo.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.5 by mocchiut, Tue Jul 18 10:58:52 2006 UTC revision 1.22 by mocchiut, Wed Aug 27 14:44:35 2014 UTC
# Line 2  Line 2 
2  #include <sstream>  #include <sstream>
3  //  //
4  #include <TObject.h>  #include <TObject.h>
5    #include <TChain.h>
6  #include <TSystem.h>  #include <TSystem.h>
7  #include <TArrayL.h>  #include <TSystemFile.h>
8    #include <TArrayI.h>
9  #include <TFile.h>  #include <TFile.h>
10  #include <TTree.h>  #include <TTree.h>
11  #include <TDirectory.h>  #include <TDirectory.h>
# Line 13  Line 15 
15  //  //
16  #include <GLTables.h>  #include <GLTables.h>
17  #include <RunInfo.h>  #include <RunInfo.h>
18    ClassImp(ProcInfo);
19  ClassImp(SoftInfo);  ClassImp(SoftInfo);
20  ClassImp(ItoRunInfo);  ClassImp(ItoRunInfo);
21  //  //
22  using namespace std;  using namespace std;
23  //  //
24    
25    ProcInfo::ProcInfo() {
26      Clear();
27    }
28    
29    void ProcInfo::Clear(Option_t *t){
30      runID = 0;
31      date = "";
32      commandLine = "";
33      outputFilename = "";
34      localDir = "";
35      uname = "";
36      DB = "";
37    }
38    
39  SoftInfo::SoftInfo() {  SoftInfo::SoftInfo() {
40      Clear();
41    }
42    
43    void SoftInfo::Clear(Option_t *t){
44    TRIG_ver = "";    TRIG_ver = "";
45    TOF_ver = "";    TOF_ver = "";
46    AC_ver = "";    AC_ver = "";
# Line 28  SoftInfo::SoftInfo() { Line 49  SoftInfo::SoftInfo() {
49    CAL_ver = "";    CAL_ver = "";
50    ND_ver = "";    ND_ver = "";
51    S4_ver = "";      S4_ver = "";  
52      DV_ver = "";
53    }
54    
55    UInt_t SoftInfo::GetSWinfo(TString Detector){
56      TString sver;
57      UInt_t version = 0;
58      if ( !strcmp(Detector.Data(),"TRIG") ){
59        sver = TRIG_ver;
60      };
61      if ( !strcmp(Detector.Data(),"TOF") ){
62        sver = TOF_ver;
63      };
64      if ( !strcmp(Detector.Data(),"AC") ){
65        sver = AC_ver;
66      };
67      if ( !strcmp(Detector.Data(),"TRK") ){
68        sver = TRK_ver;
69      };
70      if ( !strcmp(Detector.Data(),"CALO") ){
71        sver = CAL_ver;
72      };
73      if ( !strcmp(Detector.Data(),"S4") ){
74        sver = S4_ver;
75      };
76      if ( !strcmp(Detector.Data(),"DV") ){
77        sver = DV_ver;
78      };
79      if ( !strcmp(Detector.Data(),"ND") ){
80        sver = ND_ver;
81      };
82      if ( !strcmp(Detector.Data(),"ORB") ){
83        sver = ORB_ver;
84      };
85      sver.ReplaceAll("v",1," ",1);
86      sver.ReplaceAll("r",1," ",1);
87      version = (UInt_t)sver.Atoi();
88      return(version);
89    };
90    
91    /**
92     * Fills a struct cSoftInfo with values from a SoftInfo object (to put data into a F77 common).
93     */
94    void SoftInfo::GetLevel2Struct(cSoftInfo *l2) const{
95      l2->FillTrigWith(TRIG_ver);
96      l2->FillTofWith(TOF_ver);
97      l2->FillAcWith(AC_ver);
98      l2->FillTrkWith(TRK_ver);
99      l2->FillOrbWith(ORB_ver);
100      l2->FillCalWith(CAL_ver);
101      l2->FillNdWith(ND_ver);
102      l2->FillS4With(S4_ver);
103    }
104    /***********************/
105    
106    ItoRunInfo::~ItoRunInfo() {
107      this->GL_RUN::Clear();
108  }  }
109    
110  ItoRunInfo::ItoRunInfo() {  ItoRunInfo::ItoRunInfo() {
# Line 36  ItoRunInfo::ItoRunInfo() { Line 113  ItoRunInfo::ItoRunInfo() {
113    isreadonly = true;    isreadonly = true;
114    first_file_entry = 0;    first_file_entry = 0;
115    last_file_entry = 0;    last_file_entry = 0;
116    file_entries = 0ULL;    file_entries = 0;
117    totnorun = 0LL;    totnorun = 0;
118      this->GL_RUN::Clear();
119    version = new SoftInfo();    version = new SoftInfo();
   version->TRIG_ver = "";  
   version->TOF_ver = "";  
   version->AC_ver = "";  
   version->TRK_ver = "";  
   version->CAL_ver = "";  
   version->ND_ver = "";  
   version->S4_ver = "";    
   version->ORB_ver = "";    
120    norun = 0;    norun = 0;
121    runlist = new TArrayL(0,NULL);    runlist = new TArrayI(500);
122    file = new TFile();    file = NULL;
123    newtree = new TTree();    newtree = NULL;//new TTree();
124  }  }
125    
126  ItoRunInfo::ItoRunInfo(TFile *processFl){  ItoRunInfo::ItoRunInfo(TFile *processFl){
# Line 58  ItoRunInfo::ItoRunInfo(TFile *processFl) Line 128  ItoRunInfo::ItoRunInfo(TFile *processFl)
128    file=(TFile*)processFl;    file=(TFile*)processFl;
129    dbc=NULL;    dbc=NULL;
130    processFolder = "";    processFolder = "";
131    idRun = 0ULL;    idRun = 0;
132    Detector = "NONE";    Detector = "NONE";
133    //    //
134    reprocessing = false;    reprocessing = false;
135    updating = false;    updating = false;
136    first_file_entry = 0;    first_file_entry = 0;
137    last_file_entry = 0;    last_file_entry = 0;
138    file_entries = 0ULL;    file_entries = 0;
139    version = new SoftInfo();    version = new SoftInfo();
140    version->TRIG_ver = "";    //  glrun = new GL_RUN();
   version->TOF_ver = "";  
   version->AC_ver = "";  
   version->TRK_ver = "";  
   version->ORB_ver = "";  
   version->CAL_ver = "";  
   version->ND_ver = "";  
   version->S4_ver = "";    
141    norun = 0;    norun = 0;
142    totnorun = 0;    totnorun = 0;
143    //  runlist = new TArrayL(0,NULL);    runlist = new TArrayI(500);
144      newtree = NULL;
145      //
146    }
147    
148    
149    
150    TChain *ItoRunInfo::GetRunTree(TList *fl){
151      //
152      TChain *Tout = new TChain("Run");    
153      // loop over files and create chains  
154      TIter next(fl);
155      TSystemFile *questo = 0;
156      while ( (questo = (TSystemFile*) next()) ) {
157        TString name =  questo->GetName();
158        Tout->Add(name);
159      };
160      //
161      Tout->SetBranchAddress("RunInfo", GetPointerToRI());
162      printf("Run          : set branch address RunInfo\n");
163      Tout->SetBranchAddress("SoftInfo", GetPointerToSI());
164      printf("Software     : set branch address SoftInfo\n");
165      //
166      return Tout;                  
167    //    //
168  }  }
169    
# Line 91  ItoRunInfo::ItoRunInfo(TSQLServer *db, T Line 177  ItoRunInfo::ItoRunInfo(TSQLServer *db, T
177    updating = false;    updating = false;
178    first_file_entry = 0;    first_file_entry = 0;
179    last_file_entry = 0;    last_file_entry = 0;
180    file_entries = 0ULL;    file_entries = 0;
181    version = new SoftInfo();    version = new SoftInfo();
   version->TRIG_ver = "";  
   version->TOF_ver = "";  
   version->AC_ver = "";  
   version->TRK_ver = "";  
   version->ORB_ver = "";  
   version->CAL_ver = "";  
   version->ND_ver = "";  
   version->S4_ver = "";    
182    norun = 0;    norun = 0;
183    totnorun = 0;    totnorun = 0;
184    runlist = new TArrayL(0,NULL);    runlist = new TArrayI(500);
185    //    //
186  }  }
187    
188  Int_t ItoRunInfo::Update(ULong64_t run, TString Detector, TString Version){  void ItoRunInfo::CopyFromTo(GL_RUN *glrun,GL_RUN *newrun,SoftInfo *sinfo, SoftInfo *newver){
189      //
190      if ( glrun && newrun ){
191        //
192    //    printf("copy \n");
193        //
194        newrun->ID = glrun->ID                         ;
195        newrun->ID_RUN_FRAG = glrun-> ID_RUN_FRAG                ;
196        newrun->ID_ROOT_L0 = glrun->ID_ROOT_L0                 ;
197        newrun->ID_ROOT_L2 = glrun->ID_ROOT_L2                 ;
198        newrun->RUNHEADER_TIME = glrun->RUNHEADER_TIME             ;
199        newrun->RUNTRAILER_TIME = glrun->RUNTRAILER_TIME            ;
200        newrun->EV_FROM = glrun->EV_FROM                    ;
201        newrun->EV_TO = glrun->EV_TO                      ;
202        newrun->TRK_CALIB_USED = glrun->TRK_CALIB_USED             ;
203        newrun->EFF_WRK_SCHEDULE = glrun->EFF_WRK_SCHEDULE           ;
204        newrun->PRH_VAR_TRG_MODE_A = glrun->PRH_VAR_TRG_MODE_A         ;
205        newrun->PRH_VAR_TRG_MODE_B = glrun->PRH_VAR_TRG_MODE_B         ;
206        newrun->ACQ_BUILD_INFO =glrun->ACQ_BUILD_INFO             ;
207        newrun->ACQ_VAR_INFO = glrun->ACQ_VAR_INFO               ;
208        newrun->RUNHEADER_OBT = glrun->RUNHEADER_OBT              ;
209        newrun->RUNTRAILER_OBT = glrun->RUNTRAILER_OBT             ;
210        newrun->RUNHEADER_PKT = glrun->RUNHEADER_PKT              ;
211        newrun->RUNTRAILER_PKT = glrun->RUNTRAILER_PKT             ;
212        newrun->NEVENTS = glrun->NEVENTS                    ;
213        newrun->LAST_TIMESYNC = glrun->LAST_TIMESYNC              ;
214        newrun->OBT_TIMESYNC = glrun->OBT_TIMESYNC               ;
215        newrun->COMPILATIONTIMESTAMP = glrun->COMPILATIONTIMESTAMP       ;
216        newrun->FAV_WRK_SCHEDULE = glrun->FAV_WRK_SCHEDULE           ;
217        newrun->RM_ACQ_AFTER_CALIB = glrun->RM_ACQ_AFTER_CALIB         ;
218        newrun->RM_ACQ_SETTING_MODE = glrun->RM_ACQ_SETTING_MODE        ;
219        newrun->PKT_COUNTER = glrun->PKT_COUNTER                ;
220        newrun->PKT_READY_COUNTER = glrun->PKT_READY_COUNTER          ;
221        newrun->TRK_CALIB_USED = glrun->TRK_CALIB_USED             ;
222        newrun->CAL_DSP_MASK  = glrun->CAL_DSP_MASK               ;
223        newrun->BOOT_NUMBER  = glrun->BOOT_NUMBER                ;
224        newrun->PHYSENDRUN_MASK_S3S2S12  = glrun->PHYSENDRUN_MASK_S3S2S12                 ;
225        newrun->PHYSENDRUN_MASK_S11CRC  = glrun->PHYSENDRUN_MASK_S11CRC                 ;
226        newrun->VALIDATION  = glrun->VALIDATION                 ;
227        //
228      };
229      //
230      if ( newver && sinfo ){
231        //
232        newver->TRIG_ver = sinfo->TRIG_ver;
233        newver->TOF_ver = sinfo->TOF_ver;
234        newver->AC_ver = sinfo->AC_ver;
235        newver->TRK_ver = sinfo->TRK_ver;
236        newver->ORB_ver = sinfo->ORB_ver;
237        newver->CAL_ver = sinfo->CAL_ver;
238        newver->S4_ver = sinfo->S4_ver;
239        newver->DV_ver = sinfo->DV_ver;
240        newver->ND_ver = sinfo->ND_ver;
241        //
242      };
243    }
244    
245    Int_t ItoRunInfo::Update(UInt_t run, TString Detector, TString Version){
246    //    //
247    isreadonly = false;    isreadonly = false;
248    idRun = run;    idRun = run;
249    //    //
250    Bool_t debug = false;    Bool_t debug = false;
251    //    //
252    Bool_t ismydir = false;    //  Bool_t ismydir = false;
253    //    //
254    if ( !strcmp(processFolder.Data(),"") ){    if ( !strcmp(processFolder.Data(),"") ){
255      processFolder = "runinfoFolder";      processFolder = "runinfoFolder";
256      ismydir = true;      //    ismydir = true;
257    };    };
258    //    //
259    GL_RUN *oldrun = new GL_RUN();    GL_RUN *oldrun = new GL_RUN();
# Line 126  Int_t ItoRunInfo::Update(ULong64_t run, Line 261  Int_t ItoRunInfo::Update(ULong64_t run,
261    SoftInfo *oldver = new SoftInfo();    SoftInfo *oldver = new SoftInfo();
262    SoftInfo *newver = new SoftInfo();    SoftInfo *newver = new SoftInfo();
263    //    //
264    ID = 0ULL;    this->GL_RUN::Clear();
265    ID_REG_RUN = 0ULL;    version->Clear();
   ID_REG_RUN_L2 = 0ULL;  
   RUNHEADER_TIME = 0ULL;  
   RUNTRAILER_TIME = 0ULL;  
   EV_REG_PHYS_FROM = 0;  
   EV_REG_PHYS_TO = 0;    
   EV_REG_RUNHEADER = 0;    
   EV_REG_RUNTRAILER = 0;    
   TRK_CALIB_USED = 0;  
   EFF_WRK_SCHEDULE = 0;  
   PRH_VAR_TRG_MODE_A = 0;  
   PRH_VAR_TRG_MODE_B = 0;  
   ACQ_BUILD_INFO = 0;  
   ACQ_VAR_INFO = 0;  
   version->TRIG_ver = "";  
   version->TOF_ver = "";  
   version->AC_ver = "";  
   version->TRK_ver = "";  
   version->ORB_ver = "";  
   version->CAL_ver = "";  
   version->ND_ver = "";  
   version->S4_ver = "";    
266    //    //
267    norun = 0;    norun = 0;
   runlist = new TArrayL(0,NULL);  
   //runlist->Reset();  
268    //    //
269    Bool_t found = false;    Bool_t found = false;
270    Int_t error = 0;    Int_t error = 0;
271    //    //
   //  TFile *temprfile = 0;  
   //  TTree *temprrun = 0;  
   //  stringstream temprname;  
   //  stringstream tempdir;  
   //  const char* routdir = gSystem->DirName(gSystem->DirName(file->GetPath()));  
   //  
272    TTree *oldtree = 0;    TTree *oldtree = 0;
273    //    //
   //  
274    // Try to get the tree Run in the processed file    // Try to get the tree Run in the processed file
275    //    //
276    oldtree = (TTree*)file->Get("Run");      oldtree = (TTree*)file->Get("Run");  
# Line 181  Int_t ItoRunInfo::Update(ULong64_t run, Line 286  Int_t ItoRunInfo::Update(ULong64_t run,
286      version->ORB_ver = Version;      version->ORB_ver = Version;
287      version->CAL_ver = Version;          version->CAL_ver = Version;    
288      version->S4_ver = Version;      version->S4_ver = Version;
289        version->DV_ver = Version;
290      version->ND_ver = Version;      version->ND_ver = Version;
291    } else {    } else {
292      if ( !strcmp(Detector.Data(),"TRIG") ) version->TRIG_ver = Version;      if ( !strcmp(Detector.Data(),"TRIG") ) version->TRIG_ver = Version;
# Line 189  Int_t ItoRunInfo::Update(ULong64_t run, Line 295  Int_t ItoRunInfo::Update(ULong64_t run,
295      if ( !strcmp(Detector.Data(),"TRK") ) version->TRK_ver = Version;      if ( !strcmp(Detector.Data(),"TRK") ) version->TRK_ver = Version;
296      if ( !strcmp(Detector.Data(),"CALO") ) version->CAL_ver = Version;      if ( !strcmp(Detector.Data(),"CALO") ) version->CAL_ver = Version;
297      if ( !strcmp(Detector.Data(),"S4") ) version->S4_ver = Version;      if ( !strcmp(Detector.Data(),"S4") ) version->S4_ver = Version;
298        if ( !strcmp(Detector.Data(),"DV") ) version->DV_ver = Version;
299      if ( !strcmp(Detector.Data(),"ND") ) version->ND_ver = Version;      if ( !strcmp(Detector.Data(),"ND") ) version->ND_ver = Version;
300      if ( !strcmp(Detector.Data(),"ORB") ) version->ORB_ver = Version;      if ( !strcmp(Detector.Data(),"ORB") ) version->ORB_ver = Version;
301      if ( strcmp(Detector.Data(),"TRIG") && strcmp(Detector.Data(),"TOF") &&  strcmp(Detector.Data(),"AC") && strcmp(Detector.Data(),"TRK") &&  strcmp(Detector.Data(),"CALO") && strcmp(Detector.Data(),"S4") && strcmp(Detector.Data(),"ND") && strcmp(Detector.Data(),"ORB") ) return(-804);      if ( strcmp(Detector.Data(),"TRIG") && strcmp(Detector.Data(),"TOF") &&  strcmp(Detector.Data(),"AC") && strcmp(Detector.Data(),"TRK") &&  strcmp(Detector.Data(),"CALO") && strcmp(Detector.Data(),"S4") && strcmp(Detector.Data(),"ND") && strcmp(Detector.Data(),"ORB") && strcmp(Detector.Data(),"DV") ) return(-804);
302    };    };
303    //    //
304    if ( !oldtree ) {    if ( !oldtree ) {
# Line 202  Int_t ItoRunInfo::Update(ULong64_t run, Line 309  Int_t ItoRunInfo::Update(ULong64_t run,
309      //      //
310    } else {    } else {
311      //      //
 //     temprname.str("");  
 //     temprname << routdir;  
 //     temprname << "/" << processFolder.Data();  
 //     gSystem->MakeDirectory(temprname.str().c_str());  
 //     tempdir.str("");  
 //     tempdir << temprname.str().c_str();  
 //     temprname << "/runinfo_run";  
 //     temprname << idRun << ".root";    
 //     if ( debug ) printf(" file temporaneo is %s \n",temprname.str().c_str());  
 //     //  
 //     temprfile = new TFile(temprname.str().c_str(),"RECREATE");  
 //     //  
 //     temprrun = new TTree();  
 //     //  
 //     if ( !temprfile ) return(-805);  
 //     if ( !oldtree ) return(-806);  
 //     if ( !temprrun ) return(-807);  
 //     //  
 //     temprrun = oldtree->CloneTree(-1,"fast");      
 //     //  
 //     temprfile->cd();  
 //     temprrun->SetName("Run-old");  
 //     temprfile->Write();  
 //     if ( temprrun ) temprrun->Delete();  
 //     temprfile->Close();    
 //     //  
 //     oldtree->Delete("all");  
     //  
312      updating = true;      updating = true;
313      if ( debug ) printf(" RunInfo: updating versioning information \n");      if ( debug ) printf(" RunInfo: updating versioning information \n");
314      //      //
# Line 245  Int_t ItoRunInfo::Update(ULong64_t run, Line 324  Int_t ItoRunInfo::Update(ULong64_t run,
324    //      //  
325    //    //
326    if ( !updating ){    if ( !updating ){
327      if ( idRun == 0ULL ){      if ( idRun == 0 ){
328        if ( debug ) printf("\n RUNINFO - ERROR: reprocessing data but no RunInfo tree in Level2 file. \n");        if ( debug ) printf("\n RUNINFO - ERROR: reprocessing data but no RunInfo tree in Level2 file. \n");
329        return(-805);        return(-805);
330      };      };
331      //      //
     runlist = new TArrayL(1);  
     //  
332      error = Query_GL_RUN(idRun, dbc);      error = Query_GL_RUN(idRun, dbc);
333      //      //
334      if ( error ){      if ( error ){
335        if ( debug ) printf("\n RUNINFO - ERROR: Query_GL_RUN exited with non zero error\n");        if ( debug ) printf("\n RUNINFO - ERROR: Query_GL_RUN exited with non zero error\n");
336        return(error);        return(error);
337      };      };
338      if ( ID == 0ULL ){      if ( ID == 0 ){
339        if ( debug ) printf("\n RUNINFO - ERROR: no run with ID_RUN = %llu \n",idRun);        if ( debug ) printf("\n RUNINFO - ERROR: no run with ID_RUN = %u \n",idRun);
340        return(-5);        return(-5);
341      };      };
342      //      //
343      //      //
344      //      CopyFromTo((GL_RUN*)this,newrun,version,newver);
     newrun->ID = ID;  
     newrun->ID_REG_RUN = ID_REG_RUN;  
     newrun->ID_REG_RUN_L2 = ID_REG_RUN_L2;  
     newrun->RUNHEADER_TIME = RUNHEADER_TIME;  
     newrun->RUNTRAILER_TIME = RUNTRAILER_TIME;  
     newrun->EV_REG_PHYS_FROM = EV_REG_PHYS_FROM;  
     newrun->EV_REG_PHYS_TO = EV_REG_PHYS_TO;  
     newrun->EV_REG_RUNHEADER = EV_REG_RUNHEADER;  
     newrun->EV_REG_RUNTRAILER = EV_REG_RUNTRAILER;  
     newrun->TRK_CALIB_USED = TRK_CALIB_USED;  
     newrun->EFF_WRK_SCHEDULE = EFF_WRK_SCHEDULE;  
     newrun->PRH_VAR_TRG_MODE_A = PRH_VAR_TRG_MODE_A;  
     newrun->PRH_VAR_TRG_MODE_B = PRH_VAR_TRG_MODE_B;  
     newrun->ACQ_BUILD_INFO = ACQ_BUILD_INFO;  
     newrun->ACQ_VAR_INFO = ACQ_VAR_INFO;  
     newver->TRIG_ver = version->TRIG_ver;  
     newver->TOF_ver = version->TOF_ver;  
     newver->AC_ver = version->AC_ver;  
     newver->TRK_ver = version->TRK_ver;  
     newver->ORB_ver = version->ORB_ver;  
     newver->CAL_ver = version->CAL_ver;  
     newver->S4_ver = version->S4_ver;  
     newver->ND_ver = version->ND_ver;  
345      //      //
346      // fill the tree;      // fill the tree;
347      //      //
# Line 296  Int_t ItoRunInfo::Update(ULong64_t run, Line 350  Int_t ItoRunInfo::Update(ULong64_t run,
350      totnorun = 1;      totnorun = 1;
351      reprocessing = false;      reprocessing = false;
352      first_file_entry = 0;      first_file_entry = 0;
353      last_file_entry = (UInt_t)(EV_REG_PHYS_TO - EV_REG_PHYS_FROM);      if ( EV_TO >= EV_FROM ) last_file_entry = (UInt_t)(EV_TO - EV_FROM);
354      norun = 1;      norun = 1;
355      runlist->AddAt((Long64_t)ID,0);      runlist->AddAt((Int_t)ID,0);
356      //      //
357      newtree->SetName("Run");      newtree->SetName("Run");
358      //      //
359      file->cd();      file->cd();
360      //    file->Write("Run");      //
     //newtree->Delete();  
361      delete newver;      delete newver;
362      delete newrun;      delete newrun;
363      delete oldver;      delete oldver;
# Line 314  Int_t ItoRunInfo::Update(ULong64_t run, Line 367  Int_t ItoRunInfo::Update(ULong64_t run,
367      //      //
368    } else {    } else {
369      //      //
     //    temprfile = new TFile(temprname.str().c_str(),"READ");  
     //    oldtree = (TTree*)temprfile->Get("Run-old");  
370      //      //
371      oldtree->SetBranchAddress("RunInfo",&oldrun);      oldtree->SetBranchAddress("RunInfo",&oldrun);
372      oldtree->SetBranchAddress("SoftInfo",&oldver);      oldtree->SetBranchAddress("SoftInfo",&oldver);
373      //      //
374      totnorun = oldtree->GetEntries();      totnorun = oldtree->GetEntries();
375      //      //
376      runlist = new TArrayL((Int_t)totnorun);      if ( totnorun > 500 ){
377          if ( debug ) printf("\n RUNINFO - ERROR: can not handle more than 500 runs!\n");
378          return(-806);
379        };
380      //      //
381      found = false;      found = false;
382      //      //
383      for ( UInt_t run = 0; run < totnorun; run++){      for ( UInt_t run = 0; run < totnorun; run++){
384        //        //
385        oldtree->GetEntry(run);        if ( oldtree->GetEntry(run) <= 0 ) throw -36;
386        //        //
387        newrun->ID = oldrun->ID;        CopyFromTo(oldrun,newrun,oldver,newver);
       newrun->ID_REG_RUN = oldrun->ID_REG_RUN;  
       newrun->ID_REG_RUN_L2 = oldrun->ID_REG_RUN_L2;  
       newrun->RUNHEADER_TIME = oldrun->RUNHEADER_TIME;  
       newrun->RUNTRAILER_TIME = oldrun->RUNTRAILER_TIME;  
       newrun->EV_REG_PHYS_FROM = oldrun->EV_REG_PHYS_FROM;  
       newrun->EV_REG_PHYS_TO = oldrun->EV_REG_PHYS_TO;  
       newrun->EV_REG_RUNHEADER = oldrun->EV_REG_RUNHEADER;  
       newrun->EV_REG_RUNTRAILER = oldrun->EV_REG_RUNTRAILER;  
       newrun->TRK_CALIB_USED = oldrun->TRK_CALIB_USED;  
       newrun->EFF_WRK_SCHEDULE = oldrun->EFF_WRK_SCHEDULE;  
       newrun->PRH_VAR_TRG_MODE_A = oldrun->PRH_VAR_TRG_MODE_A;  
       newrun->PRH_VAR_TRG_MODE_B = oldrun->PRH_VAR_TRG_MODE_B;  
       newrun->ACQ_BUILD_INFO = oldrun->ACQ_BUILD_INFO;  
       newrun->ACQ_VAR_INFO = oldrun->ACQ_VAR_INFO;  
       newver->TRIG_ver = oldver->TRIG_ver;  
       newver->TOF_ver = oldver->TOF_ver;  
       newver->AC_ver = oldver->AC_ver;  
       newver->TRK_ver = oldver->TRK_ver;  
       newver->ORB_ver = oldver->ORB_ver;  
       newver->CAL_ver = oldver->CAL_ver;  
       newver->S4_ver = oldver->S4_ver;  
       newver->ND_ver = oldver->ND_ver;  
388        //        //
389        file_entries += (oldrun->EV_REG_PHYS_TO - oldrun->EV_REG_PHYS_FROM + 1);        file_entries += (oldrun->EV_TO - oldrun->EV_FROM + 1);
390        //        //
391        if ( debug ) printf("totnorun %i idRun %i newrun->ID %i \n",(int)totnorun,(int)idRun,(int)newrun->ID);        if ( debug ) printf("totnorun %i idRun %i newrun->ID %i \n",(int)totnorun,(int)idRun,(int)newrun->ID);
392        //        //
393        if ( idRun == 0ULL || idRun == newrun->ID ) {        if ( idRun == 0 || idRun == newrun->ID ) {
394          //          //
395          if ( debug ) printf(" Updating run number %llu \n",idRun);          if ( debug ) printf(" Updating run number %u newrun->ID %i \n",idRun,(int)newrun->ID);
396          //          //
397          found = true;          found = true;
398          //          //
# Line 378  Int_t ItoRunInfo::Update(ULong64_t run, Line 410  Int_t ItoRunInfo::Update(ULong64_t run,
410              return(error);              return(error);
411            };            };
412            //            //
413            newrun->ID = ID;            CopyFromTo((GL_RUN*)this,newrun,NULL,NULL);
414            newrun->ID_REG_RUN = ID_REG_RUN;            //
           newrun->ID_REG_RUN_L2 = ID_REG_RUN_L2;  
           newrun->RUNHEADER_TIME = RUNHEADER_TIME;  
           newrun->RUNTRAILER_TIME = RUNTRAILER_TIME;  
           newrun->EV_REG_PHYS_FROM = EV_REG_PHYS_FROM;  
           newrun->EV_REG_PHYS_TO = EV_REG_PHYS_TO;  
           newrun->EV_REG_RUNHEADER = EV_REG_RUNHEADER;  
           newrun->EV_REG_RUNTRAILER = EV_REG_RUNTRAILER;  
           newrun->TRK_CALIB_USED = TRK_CALIB_USED;  
           newrun->EFF_WRK_SCHEDULE = EFF_WRK_SCHEDULE;  
           newrun->PRH_VAR_TRG_MODE_A = PRH_VAR_TRG_MODE_A;  
           newrun->PRH_VAR_TRG_MODE_B = PRH_VAR_TRG_MODE_B;  
           newrun->ACQ_BUILD_INFO = ACQ_BUILD_INFO;  
           newrun->ACQ_VAR_INFO = ACQ_VAR_INFO;  
415          } else {          } else {
416            //            //
417            if ( !strcmp(Detector.Data(),"TRIG") ){            if ( !strcmp(Detector.Data(),"TRIG") ){
# Line 403  Int_t ItoRunInfo::Update(ULong64_t run, Line 422  Int_t ItoRunInfo::Update(ULong64_t run,
422              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
423              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
424              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
425                newver->DV_ver = oldver->DV_ver;
426              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
427              if ( strcmp(oldver->TRIG_ver.Data(),"") ) reprocessing = true;              if ( strcmp(oldver->TRIG_ver.Data(),"") ) reprocessing = true;
428            };            };
# Line 413  Int_t ItoRunInfo::Update(ULong64_t run, Line 433  Int_t ItoRunInfo::Update(ULong64_t run,
433              newver->TRK_ver = oldver->TRK_ver;              newver->TRK_ver = oldver->TRK_ver;
434              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
435              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
436                newver->DV_ver = oldver->DV_ver;
437              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
438              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
439              if ( strcmp(oldver->TOF_ver.Data(),"") ) reprocessing = true;              if ( strcmp(oldver->TOF_ver.Data(),"") ) reprocessing = true;
# Line 423  Int_t ItoRunInfo::Update(ULong64_t run, Line 444  Int_t ItoRunInfo::Update(ULong64_t run,
444              newver->TRK_ver = oldver->TRK_ver;              newver->TRK_ver = oldver->TRK_ver;
445              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
446              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
447                newver->DV_ver = oldver->DV_ver;
448              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
449              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
450              newver->AC_ver = version->AC_ver;              newver->AC_ver = version->AC_ver;
# Line 433  Int_t ItoRunInfo::Update(ULong64_t run, Line 455  Int_t ItoRunInfo::Update(ULong64_t run,
455              newver->TOF_ver = oldver->TOF_ver;              newver->TOF_ver = oldver->TOF_ver;
456              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
457              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
458                newver->DV_ver = oldver->DV_ver;
459              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
460              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
461              newver->AC_ver = oldver->AC_ver;              newver->AC_ver = oldver->AC_ver;
# Line 444  Int_t ItoRunInfo::Update(ULong64_t run, Line 467  Int_t ItoRunInfo::Update(ULong64_t run,
467              newver->TOF_ver = oldver->TOF_ver;              newver->TOF_ver = oldver->TOF_ver;
468              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
469              newver->TRK_ver = oldver->TRK_ver;              newver->TRK_ver = oldver->TRK_ver;
470                newver->DV_ver = oldver->DV_ver;
471              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
472              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
473              newver->AC_ver = oldver->AC_ver;              newver->AC_ver = oldver->AC_ver;
# Line 453  Int_t ItoRunInfo::Update(ULong64_t run, Line 477  Int_t ItoRunInfo::Update(ULong64_t run,
477            if ( !strcmp(Detector.Data(),"CALO") ){            if ( !strcmp(Detector.Data(),"CALO") ){
478              newver->TRIG_ver = oldver->TRIG_ver;              newver->TRIG_ver = oldver->TRIG_ver;
479              newver->TOF_ver = oldver->TOF_ver;              newver->TOF_ver = oldver->TOF_ver;
480                newver->DV_ver = oldver->DV_ver;
481              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
482              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
483              newver->ND_ver = oldver->ND_ver;              newver->ND_ver = oldver->ND_ver;
# Line 469  Int_t ItoRunInfo::Update(ULong64_t run, Line 494  Int_t ItoRunInfo::Update(ULong64_t run,
494              newver->TRK_ver = oldver->TRK_ver;              newver->TRK_ver = oldver->TRK_ver;
495              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
496              newver->CAL_ver = oldver->CAL_ver;              newver->CAL_ver = oldver->CAL_ver;
497                newver->DV_ver = oldver->DV_ver;
498              newver->S4_ver = version->S4_ver;              newver->S4_ver = version->S4_ver;
499              if ( strcmp(oldver->S4_ver.Data(),"") ) reprocessing = true;              if ( strcmp(oldver->S4_ver.Data(),"") ) reprocessing = true;
500            };            };
501              if ( !strcmp(Detector.Data(),"DV") ){
502                newver->TRIG_ver = oldver->TRIG_ver;
503                newver->TOF_ver = oldver->TOF_ver;
504                newver->ND_ver = oldver->ND_ver;
505                newver->AC_ver = oldver->AC_ver;
506                newver->TRK_ver = oldver->TRK_ver;
507                newver->ORB_ver = oldver->ORB_ver;
508                newver->CAL_ver = oldver->CAL_ver;
509                newver->S4_ver = oldver->S4_ver;
510                newver->DV_ver = version->DV_ver;
511                if ( strcmp(oldver->DV_ver.Data(),"") ) reprocessing = true;
512              };
513            if ( !strcmp(Detector.Data(),"ND") ){            if ( !strcmp(Detector.Data(),"ND") ){
514              newver->TRIG_ver = oldver->TRIG_ver;              newver->TRIG_ver = oldver->TRIG_ver;
515              newver->TOF_ver = oldver->TOF_ver;              newver->TOF_ver = oldver->TOF_ver;
516                newver->DV_ver = oldver->DV_ver;
517              newver->S4_ver = oldver->S4_ver;              newver->S4_ver = oldver->S4_ver;
518              newver->AC_ver = oldver->AC_ver;              newver->AC_ver = oldver->AC_ver;
519              newver->ORB_ver = oldver->ORB_ver;              newver->ORB_ver = oldver->ORB_ver;
# Line 485  Int_t ItoRunInfo::Update(ULong64_t run, Line 524  Int_t ItoRunInfo::Update(ULong64_t run,
524            };            };
525          };          };
526          //          //
527          last_file_entry = first_file_entry + (oldrun->EV_REG_PHYS_TO - oldrun->EV_REG_PHYS_FROM + 1);          if ( oldrun->EV_TO >= oldrun->EV_FROM ) last_file_entry = first_file_entry + (oldrun->EV_TO - oldrun->EV_FROM + 1);
528          //          //
529        } else {        } else {
530          if ( !found ) first_file_entry += (oldrun->EV_REG_PHYS_TO - oldrun->EV_REG_PHYS_FROM + 1);          if ( !found ) first_file_entry += (oldrun->EV_TO - oldrun->EV_FROM + 1);
531        };        };
532        //        //
533        file->cd();        file->cd();
534          if ( debug ) printf("filling: totnorun %i idRun %i newrun->ID %i \n",(int)totnorun,(int)idRun,(int)newrun->ID);
535        newtree->Fill();        newtree->Fill();
536        //        //
537      };      };
538      //      //
     //    temprfile->Close();  
     //    gSystem->Unlink(temprname.str().c_str());  
     //    if ( ismydir ) gSystem->Unlink(tempdir.str().c_str());  
539      file->cd();      file->cd();
540      if ( oldtree ) oldtree->Delete("all");      if ( oldtree ) oldtree->Delete("all");
541      newtree->SetName("Run");      newtree->SetName("Run");
542      //    file->Write("Run");      //
     //    newtree->Delete();  
543      delete newver;      delete newver;
544      delete newrun;      delete newrun;
545      delete oldver;      delete oldver;
546      delete oldrun;      delete oldrun;
547      //      //
548      if ( !found ){      if ( !found ){
549        if ( debug ) printf("\n RUNINFO - ERROR: no run with ID_RUN = %llu \n",idRun);        if ( debug ) printf("\n RUNINFO - ERROR: no run with ID_RUN = %u \n",idRun);
550        return(-5);        return(-5);
551      };      };
552      //      //
553        this->Write();
554      //    newtree->Write();      //    newtree->Write();
555    };    };
556    //  if ( oldtree ) oldtree->Delete(); // crasha qua in queste righe e se non le metti...
557    //  if ( newver ) delete newver;
558    //  if ( newrun ) delete newrun;
559    //  if ( oldver ) delete oldver;
560    //  if ( oldrun ) delete oldrun;
561    return(0);    return(0);
562  }  }
563    
564  Int_t ItoRunInfo::Read(ULong64_t idRun){  void ItoRunInfo::Write(){
565      file->cd();
566      newtree->Write("Run",TObject::kOverwrite);
567    }
568    
569    Int_t ItoRunInfo::Read(UInt_t idRun){
570    //    //
571    isreadonly = true;    isreadonly = true;
572    //    //
# Line 546  Int_t ItoRunInfo::Read(ULong64_t idRun){ Line 593  Int_t ItoRunInfo::Read(ULong64_t idRun){
593      //      //
594      totnorun = newtree->GetEntries();      totnorun = newtree->GetEntries();
595      //      //
596      runlist = new TArrayL((Int_t)totnorun);      if ( totnorun > 500 ){
597          if ( debug ) printf("\n RUNINFO - ERROR: can not handle more than 500 runs!\n");
598          return(-806);
599        };
600      //      //
601      first_file_entry = 0;      first_file_entry = 0;
602      //      //
603      for ( UInt_t run = 0; run < totnorun; run++){      for ( UInt_t run = 0; run < totnorun; run++){
604        //        //
605        newtree->GetEntry(run);        if ( newtree->GetEntry(run) <= 0 ) throw -36;
606        //        //
607        file_entries += (newrun->EV_REG_PHYS_TO - newrun->EV_REG_PHYS_FROM + 1);        file_entries += (newrun->EV_TO - newrun->EV_FROM + 1);
608        //        //
609        if ( debug ) printf("totnorun %i  newrun->ID %i \n",(int)totnorun,(int)newrun->ID);        if ( debug ) printf("totnorun %i  newrun->ID %i \n",(int)totnorun,(int)newrun->ID);
610        //        //
611        ID = newrun->ID;        CopyFromTo(newrun,(GL_RUN*)this,newver,version);
612        ID_REG_RUN = newrun->ID_REG_RUN;        if ( idRun == ID || idRun == 0 ){
       ID_REG_RUN_L2 = newrun->ID_REG_RUN_L2;  
       RUNHEADER_TIME = newrun->RUNHEADER_TIME;  
       RUNTRAILER_TIME = newrun->RUNTRAILER_TIME;  
       EV_REG_PHYS_FROM = newrun->EV_REG_PHYS_FROM;  
       EV_REG_PHYS_TO = newrun->EV_REG_PHYS_TO;  
       EV_REG_RUNHEADER = newrun->EV_REG_RUNHEADER;  
       EV_REG_RUNTRAILER = newrun->EV_REG_RUNTRAILER;  
       TRK_CALIB_USED = newrun->TRK_CALIB_USED;  
       EFF_WRK_SCHEDULE = newrun->EFF_WRK_SCHEDULE;  
       PRH_VAR_TRG_MODE_A = newrun->PRH_VAR_TRG_MODE_A;  
       PRH_VAR_TRG_MODE_B = newrun->PRH_VAR_TRG_MODE_B;  
       ACQ_BUILD_INFO = newrun->ACQ_BUILD_INFO;  
       ACQ_VAR_INFO = newrun->ACQ_VAR_INFO;  
       version->TRIG_ver = newver->TRIG_ver;  
       version->TOF_ver = newver->TOF_ver;  
       version->AC_ver = newver->AC_ver;  
       version->TRK_ver = newver->TRK_ver;  
       version->ORB_ver = newver->ORB_ver;  
       version->CAL_ver = newver->CAL_ver;  
       version->S4_ver = newver->S4_ver;  
       version->ND_ver = newver->ND_ver;  
       if ( idRun == ID || idRun == 0ULL ){  
613          runlist->AddAt(newrun->ID,norun);          runlist->AddAt(newrun->ID,norun);
614          norun++;          norun++;
615        };        };
616        last_file_entry = first_file_entry + (newrun->EV_REG_PHYS_TO - newrun->EV_REG_PHYS_FROM + 1);        if ( newrun->EV_TO >= newrun->EV_FROM ) last_file_entry = first_file_entry + (newrun->EV_TO - newrun->EV_FROM + 1);
617      };      };
618    };    };
619    if ( debug ) printf("norun %i \n",(int)norun);    if ( debug ) printf("norun %i \n",(int)norun);
# Line 602  void ItoRunInfo::Close(){ Line 630  void ItoRunInfo::Close(){
630    updating = false;    updating = false;
631    first_file_entry = 0;    first_file_entry = 0;
632    last_file_entry = 0;    last_file_entry = 0;
633    file_entries = 0ULL;    file_entries = 0;
634    norun = 0;    norun = 0;
635    runlist = new TArrayL(0,NULL);    delete runlist;
636    file = new TFile();      //  file = new TFile();  
637    if ( isreadonly ) newtree->Delete();    file = 0;  
638      //  if ( isreadonly ) newtree->Delete();
639  }  }
640    
641  void ItoRunInfo::Clear(){  void ItoRunInfo::Clear(Option_t *t){
642    if ( newtree ) newtree->Delete();    if ( newtree ) newtree->Delete();
643  }  }
644    
# Line 621  UInt_t ItoRunInfo::GetRunForEntry(UInt_t Line 650  UInt_t ItoRunInfo::GetRunForEntry(UInt_t
650    //    //
651    if ( entry > (UInt_t)last_file_entry ){    if ( entry > (UInt_t)last_file_entry ){
652      for ( UInt_t nrun = 0; nrun < norun; nrun++){        for ( UInt_t nrun = 0; nrun < norun; nrun++){  
653        if ( ID == (ULong64_t)runlist->At(nrun) ) {        if ( ID == (UInt_t)runlist->At(nrun) ) {
654          startfrom = nrun+1;          startfrom = nrun+1;
655          break;          break;
656        };        };
# Line 635  UInt_t ItoRunInfo::GetRunForEntry(UInt_t Line 664  UInt_t ItoRunInfo::GetRunForEntry(UInt_t
664   retry:   retry:
665    //    //
666    for ( UInt_t nrun = startfrom; nrun < norun; nrun++){      for ( UInt_t nrun = startfrom; nrun < norun; nrun++){  
667      GetRunInfo((ULong64_t)runlist->At(nrun));      GetRunInfo((UInt_t)runlist->At(nrun));
668      if ( entry >= (UInt_t)first_file_entry && entry <= (UInt_t)last_file_entry ){      if ( entry >= (UInt_t)first_file_entry && entry <= (UInt_t)last_file_entry ){
669        return((UInt_t)runlist->At(nrun));        return((UInt_t)runlist->At(nrun));
670      };      };
# Line 648  UInt_t ItoRunInfo::GetRunForEntry(UInt_t Line 677  UInt_t ItoRunInfo::GetRunForEntry(UInt_t
677    return(0);    return(0);
678  }  }
679    
680  Int_t ItoRunInfo::GetRunInfo(ULong64_t run){  Int_t ItoRunInfo::GetRunInfo(UInt_t run){
681    Bool_t found = false;    Bool_t found = false;
682    SoftInfo *nwver = new SoftInfo();    SoftInfo *nwver = new SoftInfo();
683    GL_RUN *nwrun = new GL_RUN();    GL_RUN *nwrun = new GL_RUN();
# Line 662  Int_t ItoRunInfo::GetRunInfo(ULong64_t r Line 691  Int_t ItoRunInfo::GetRunInfo(ULong64_t r
691    totnorun = newtree->GetEntries();    totnorun = newtree->GetEntries();
692    //    //
693    for ( UInt_t nrun = 0; nrun < totnorun; nrun++){      for ( UInt_t nrun = 0; nrun < totnorun; nrun++){  
694      newtree->GetEntry(nrun);      if ( newtree->GetEntry(nrun) <= 0 ) throw -36;
695      //      //
696      if ( nwrun->ID == run || run == 0ULL ){      if ( nwrun->ID == run || run == 0 ){
697        ID = nwrun->ID;        CopyFromTo(nwrun,(GL_RUN*)this,nwver,version);
       ID_REG_RUN = nwrun->ID_REG_RUN;  
       ID_REG_RUN_L2 = nwrun->ID_REG_RUN_L2;  
       RUNHEADER_TIME = nwrun->RUNHEADER_TIME;  
       RUNTRAILER_TIME = nwrun->RUNTRAILER_TIME;  
       EV_REG_PHYS_FROM = nwrun->EV_REG_PHYS_FROM;  
       EV_REG_PHYS_TO = nwrun->EV_REG_PHYS_TO;  
       EV_REG_RUNHEADER = nwrun->EV_REG_RUNHEADER;  
       EV_REG_RUNTRAILER = nwrun->EV_REG_RUNTRAILER;  
       TRK_CALIB_USED = nwrun->TRK_CALIB_USED;  
       EFF_WRK_SCHEDULE = nwrun->EFF_WRK_SCHEDULE;  
       PRH_VAR_TRG_MODE_A = nwrun->PRH_VAR_TRG_MODE_A;  
       PRH_VAR_TRG_MODE_B = nwrun->PRH_VAR_TRG_MODE_B;  
       ACQ_BUILD_INFO = nwrun->ACQ_BUILD_INFO;  
       ACQ_VAR_INFO = nwrun->ACQ_VAR_INFO;  
       version->TRIG_ver = nwver->TRIG_ver;  
       version->TOF_ver = nwver->TOF_ver;  
       version->AC_ver = nwver->AC_ver;  
       version->TRK_ver = nwver->TRK_ver;  
       version->ORB_ver = nwver->ORB_ver;  
       version->CAL_ver = nwver->CAL_ver;  
       version->S4_ver = nwver->S4_ver;  
       version->ND_ver = nwver->ND_ver;  
698        found = true;        found = true;
699        last_file_entry = first_file_entry + (nwrun->EV_REG_PHYS_TO - nwrun->EV_REG_PHYS_FROM + 1);        if ( nwrun->EV_TO >= nwrun->EV_FROM ) last_file_entry = first_file_entry + (nwrun->EV_TO - nwrun->EV_FROM + 1);
700      };      };
701      if ( !found ) first_file_entry += (nwrun->EV_REG_PHYS_TO - nwrun->EV_REG_PHYS_FROM + 1);      if ( !found ) first_file_entry += (nwrun->EV_TO - nwrun->EV_FROM + 1);
702    };    };
703    delete nwver;    delete nwver;
704    delete nwrun;    delete nwrun;

Legend:
Removed from v.1.5  
changed lines
  Added in v.1.22

  ViewVC Help
Powered by ViewVC 1.1.23