/[PAMELA software]/quicklook/tracker/flight/macros/FTrkScanQLook_EXPERT.cxx
ViewVC logotype

Diff of /quicklook/tracker/flight/macros/FTrkScanQLook_EXPERT.cxx

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

revision 1.6 by pam-fi, Sun Jul 2 17:41:15 2006 UTC revision 1.17 by pam-fi, Sat Dec 2 16:12:47 2006 UTC
# Line 2  Line 2 
2   *  FTrkScanQlook_EXPERT.cxx   *  FTrkScanQlook_EXPERT.cxx
3   *   *
4   * autor: D.Fedele   * autor: D.Fedele
5   * version v1r05   * version v1r16
6   * Parameters:   * Parameters:
7   *      file - the path to the root file to analyze   *      file - the path to the root file to analyze
8   *      outdir - total path of output file   *      outdir - total path of output file
# Line 173  void FTrkScanQLook_EXPERT(TString file, Line 173  void FTrkScanQLook_EXPERT(TString file,
173    printf(" Number of Header Entries: %d\n",neventH);    printf(" Number of Header Entries: %d\n",neventH);
174        
175    Long64_t obt=0;      Long64_t obt=0;  
176      Int_t ev[2];
177      TString cal="";
178    
179      ev[0]=0;
180      ev[1]=0;
181    for(Int_t i=0;i<neventH;i++){    for(Int_t i=0;i<neventH;i++){
182      otr->GetEntry(i);      otr->GetEntry(i);
183      pH = eH->GetPscuHeader();      pH = eH->GetPscuHeader();
184      if(reh->TRK_CALIB_USED!=104){      if(reh->TRK_CALIB_USED!=104){
185        obt = pH->GetOrbitalTime();        obt = pH->GetOrbitalTime();
186          cal="Event with online calibration";
187        break;        break;
188      }      }
189      if(i==neventH-1){      if(i==neventH-1){
190        printf("\n\n ******  ONLINE CALIBRATION NOT FOUND IN THIS FILE  ******\n\n");        cal="*****  ONLINE CALIBRATION NOT FOUND IN THIS FILE  *****";
191        return;        ev[0]=2;
192          ev[1]=3;
193      }      }
194    }    }
195    Int_t ev[2];    if(ev[0]==0){
196    for(Int_t i=0;i<nevents;i++){      for(Int_t i=0;i<nevents;i++){
197      tr->GetEntry(i);        tr->GetEntry(i);
198      ph = eh->GetPscuHeader();        ph = eh->GetPscuHeader();
199      if(ph->GetOrbitalTime()>obt){        if(ph->GetOrbitalTime()>obt){
200        ev[0]=i+2;          ev[0]=i+3;
201        ev[1]=i+3;          ev[1]=i+4;
202        break;          break;
203          }
204      }      }
205    }    }
206    
# Line 203  void FTrkScanQLook_EXPERT(TString file, Line 211  void FTrkScanQLook_EXPERT(TString file,
211    TCanvas *c1[2];    TCanvas *c1[2];
212    
213    for(Int_t e=0;e<2;e++){    for(Int_t e=0;e<2;e++){
214      event=ev[e];      if(event==0)
215      printf("Scan of Entry %d\n",event-1);        event=ev[e];
216        else {
217          event=event+e;
218          if(event>ev[e] && ev[0]!=2)
219            cal="Event with online calibration";
220          else
221            cal="*****  ONLINE CALIBRATION NOT FOUND IN THIS FILE  *****";
222        }
223        printf("Scan of Entry %d\n",event);
224                            
225      tr->GetEntry(event-1);          tr->GetEntry(event);    
226      //============================================================================        //============================================================================  
227    
228      gStyle->SetLabelSize(0.06,"x");      gStyle->SetLabelSize(0.06,"x");
# Line 228  void FTrkScanQLook_EXPERT(TString file, Line 244  void FTrkScanQLook_EXPERT(TString file,
244      c1[e]->SetFillColor(10);      c1[e]->SetFillColor(10);
245      c1[e]->Range(0,0,1,1);      c1[e]->Range(0,0,1,1);
246      stringstream fromfile;      stringstream fromfile;
247      fromfile<<"FTrkScanQLook_EXPERT      File: "<<ffile<<"            ---->  Entry  "<<event-1;      fromfile<<"FTrkScanQLook_EXPERT      File: "<<ffile<<"            ---->  Entry  "<<event;
248      TLatex *t=new TLatex();      TLatex *t=new TLatex();
249      t->SetTextFont(32);      t->SetTextFont(32);
250      t->SetTextColor(1);      t->SetTextColor(1);
251      t->SetTextAlign(12);      t->SetTextAlign(12);
252      t->SetTextSize(0.02);      t->SetTextSize(0.02);
253      t->DrawLatex(0.02,0.98,fromfile.str().c_str());      t->DrawLatex(0.02,0.98,fromfile.str().c_str());
254        t->DrawLatex(0.60,0.98,cal.Data());
255    
256      //  draw pads      //  draw pads
257      TPad *trkpad[12];          //pad for histos      TPad *trkpad[12];          //pad for histos
# Line 309  void FTrkScanQLook_EXPERT(TString file, Line 326  void FTrkScanQLook_EXPERT(TString file,
326        ifull[nn]=0;        ifull[nn]=0;
327        icomp[nn]=0;        icomp[nn]=0;
328        imax[nn]=0;        imax[nn]=0;
329          if(ndsp>0){
330            if(ndsp<13){
331                    
332        /*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*            /*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
333         *             *
334         * Write event LEVEL0 report             * Write event LEVEL0 report
335         *             *
336         *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*/             *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*/
337    
338        trkpadtext[nn]->SetTextFont(40);            trkpadtext[nn]->SetTextFont(40);
339        trkpadtext[nn]->SetFillColor(33);            trkpadtext[nn]->SetFillColor(33);
340        trkpadtext[nn]->SetTextSize(0.012);            trkpadtext[nn]->SetTextSize(0.012);
341        trkpadtext[nn]->SetTextAlign(13);            trkpadtext[nn]->SetTextAlign(13);
342    
343        trkpadtext[nn]->AddText(" ");            trkpadtext[nn]->AddText(" ");
344        message<<"DAQ mode  --------> "<<trk->DAQmode[n];            message<<"DAQ mode  --------> "<<trk->DAQmode[n];
345        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
346        message.str("");            message.str("");
347        message<<"Event number  --------> "<<trk->eventn[n];            message<<"Event number  --------> "<<trk->eventn[n];
348        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
349        message.str("");            message.str("");
350        message<<"13-bit words --------> "<<trk->DATAlength[n];            message<<"13-bit words --------> "<<trk->DATAlength[n];
351        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
352        message.str("");            message.str("");
353        if (!(nn%2)&&trk->signcluster[n][0]!=0) message<<"L1  add:  "<<trk->addrcluster[n][0]<<" - sign: "<<1024-(trk->signcluster[n][0]);            if (!(nn%2)&&trk->signcluster[n][0]!=0) message<<"L1  add:  "<<trk->addrcluster[n][0]<<" - sign: "<<1024-(trk->signcluster[n][0]);
354        else message<<"L1  add:  "<<trk->addrcluster[n][0]<<" - sign: "<<(trk->signcluster[n][0]);            else message<<"L1  add:  "<<trk->addrcluster[n][0]<<" - sign: "<<(trk->signcluster[n][0]);
355        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
356        message.str("");            message.str("");
357        if (!(nn%2)&&trk->signcluster[n][1]!=0) message<<"L2  add:  "<<trk->addrcluster[n][1]<<" - sign: "<<1024-(trk->signcluster[n][1]);            if (!(nn%2)&&trk->signcluster[n][1]!=0) message<<"L2  add:  "<<trk->addrcluster[n][1]<<" - sign: "<<1024-(trk->signcluster[n][1]);
358        else message<<"L2  add:  "<<trk->addrcluster[n][1]<<" - sign: "<<trk->signcluster[n][1];            else message<<"L2  add:  "<<trk->addrcluster[n][1]<<" - sign: "<<trk->signcluster[n][1];
359        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
360        message.str("");            message.str("");
361        if (!(nn%2)&&trk->signcluster[n][2]!=0) message<<"L3  add:  "<<trk->addrcluster[n][2]<<" - sign: "<<1024-(trk->signcluster[n][2]);            if (!(nn%2)&&trk->signcluster[n][2]!=0) message<<"L3  add:  "<<trk->addrcluster[n][2]<<" - sign: "<<1024-(trk->signcluster[n][2]);
362        else message<<"L3  add:  "<<trk->addrcluster[n][2]<<" - sign: "<<trk->signcluster[n][2];            else message<<"L3  add:  "<<trk->addrcluster[n][2]<<" - sign: "<<trk->signcluster[n][2];
363        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
364        message.str("");            message.str("");
365        message<<"NCLUST "<<trk->nclust[n]<<"    CUTC "<<trk->cutc[n]<<"   CUTCL "<<trk->cutcl[n];            message<<"NCLUST "<<trk->nclust[n]<<"    CUTC "<<trk->cutc[n]<<"   CUTCL "<<trk->cutcl[n];
366        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
367        message.str("");            message.str("");
368        message<<"Comp. time "<<trk->compressiontime[n]<<" x 0.051ms = "<<0.051*trk->compressiontime[n]<<" ms";            message<<"Comp. time "<<trk->compressiontime[n]<<" x 0.051ms = "<<0.051*trk->compressiontime[n]<<" ms";
369        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
370        message.str("");            message.str("");
371        trkpadtext[nn]->AddText(" ");            trkpadtext[nn]->AddText(" ");
372        message<<"CRC -->  "<<trk->crc[n];            message<<"CRC -->  "<<trk->crc[n];
373        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
374        message.str("");            message.str("");
375        message<<"FL1-6 -->  "<<trk->fl1[n]<<" "<<trk->fl2[n]<<" "<<trk->fl3[n]<<" "<<trk->fl4[n]<<" "<<trk->fl5[n]<<" "<<trk->fl6[n]<<" FC "<<trk->fc[n];            message<<"FL1-6 -->  "<<trk->fl1[n]<<" "<<trk->fl2[n]<<" "<<trk->fl3[n]<<" "<<trk->fl4[n]<<" "<<trk->fl5[n]<<" "<<trk->fl6[n]<<" FC "<<trk->fc[n];
376        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
377        message.str("");            message.str("");
378        trkpadtext[nn]->AddText(" ");            trkpadtext[nn]->AddText(" ");
379        trkpadtext[nn]->AddLine(0,0,0,0);            trkpadtext[nn]->AddLine(0,0,0,0);
380        message<<"PNum "<<trk->pnum[n]<<" - BId "<<trk->bid[n]<<"       ALARM  "<<trk->alarm[n];            message<<"PNum "<<trk->pnum[n]<<" - BId "<<trk->bid[n]<<"       ALARM  "<<trk->alarm[n];
381        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
382        message.str("");            message.str("");
383        message<<"Cmd "<<trk->cmdnum[n]<<" --- Answer length "<<trk->aswr[n]<<" byte";            message<<"Cmd "<<trk->cmdnum[n]<<" --- Answer length "<<trk->aswr[n]<<" byte";
384        trkpadtext[nn]->AddText(message.str().c_str());            trkpadtext[nn]->AddText(message.str().c_str());
385        message.str("");            message.str("");
386        trkpadtext[nn]->AddText(" ");            trkpadtext[nn]->AddText(" ");
387                    
388        TOTDATAlength_check = TOTDATAlength_check + trk->DATAlength[n];            TOTDATAlength_check = TOTDATAlength_check + trk->DATAlength[n];
389    
390        /*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*            /*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*
391         *             *
392         * Plot event LEVEL0 histo             * Plot event LEVEL0 histo
393         *             *
394         *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*/             *.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*/
395    
396        //=============================================            //=============================================
397    
398        for(Int_t i = 0; i< 3072; i++){            for(Int_t i = 0; i< 3072; i++){
399          whistomax[i] = -200;              whistomax[i] = -200;
400          whistocomp[i] = -200;              whistocomp[i] = -200;
401          whistofull[i] = -200;              whistofull[i] = -200;
402          whisto[i] = -200;              whisto[i] = -200;
403        }            }
404    
405        //      ===============            //      ===============
406        //      trasmitted data            //      trasmitted data
407        //      ===============            //      ===============
408    
409        address = 0;            address = 0;
410        ladder = 1;            ladder = 1;
411        for(Int_t i = 0; i < trk->DATAlength[n] ; i++){            for(Int_t i = 0; i < trk->DATAlength[n] ; i++){
412          word = trk->TrackerData.At(iword);                        word = trk->TrackerData.At(iword);      
413          thisword = datadecode(word);              thisword = datadecode(word);
414          iword++;              iword++;
415          switch (thisword.type){              switch (thisword.type){
416                            
417          case 0:  //ADC value              case 0:  //ADC value
418            whisto[address] = thisword.decode;                whisto[address] = thisword.decode;
419            address++;                    address++;    
420            //    cout << "    adr " << address << "\n";                //        cout << "    adr " << address << "\n";
421            break;                break;
422    
423          case 1:  //address              case 1:  //address
424            address = 1024*(ladder-1) + thisword.decode;                address = 1024*(ladder-1) + thisword.decode;
425            //    cout << "    adr " << address << "\n";                //        cout << "    adr " << address << "\n";
426            break;                break;
427    
428          case 2:  //end-of-ladder              case 2:  //end-of-ladder
429            ladder = thisword.decode;                ladder = thisword.decode;
430            //            cout << "Ladder " << ladder << "\n";                //                cout << "Ladder " << ladder << "\n";
431            if(ladder==3){                if(ladder==3){
432              //                  end of compressed data - FILL HISTO                  //                  end of compressed data - FILL HISTO
433              //cout << ">>> COMPRESSED data" << "\n";                  //cout << ">>> COMPRESSED data" << "\n";
434              for(ii = 0; ii < 3072; ii++){                  for(ii = 0; ii < 3072; ii++){
435                whistocomp[ii]=whisto[ii];                    whistocomp[ii]=whisto[ii];
436                whisto[ii] = -200;                    whisto[ii] = -200;
437              }                  }
438              address = 0;                  address = 0;
439              ladder = 1;                              ladder = 1;                
440            }else if(ladder==6){                }else if(ladder==6){
441              //                  end of full data - FILL HISTO                  //                  end of full data - FILL HISTO
442              //cout << ">>> FULL data" << "\n";                  //cout << ">>> FULL data" << "\n";
443              for(ii = 0; ii < 3072; ii++){                  for(ii = 0; ii < 3072; ii++){
444                whistofull[ii]=whisto[ii];                    whistofull[ii]=whisto[ii];
445                whisto[ii] = -200;                    whisto[ii] = -200;
446              }                  }
447              address = 0;                  address = 0;
448              ladder = 1;                  ladder = 1;
449            }else{                                }else{            
450              if(ladder>3)        ladder=ladder-3;                  if(ladder>3)    ladder=ladder-3;
451              address= ladder*1024;                                address= ladder*1024;          
452              ladder = ladder + 1;                          ladder = ladder + 1;    
453            }                }
454          }                  }    
455        }                }    
456                    
457    
458        //      ===============            //      ===============
459        //      maximum signals            //      maximum signals
460        //      ===============            //      ===============
461        if(trk->signcluster[nn][0]!=0) whistomax[   0+(int)trk->addrcluster[nn][0]] = whistocomp[   0+(int)trk->addrcluster[nn][0]];            if(trk->signcluster[nn][0]!=0) whistomax[   0+(int)trk->addrcluster[nn][0]] = whistocomp[   0+(int)trk->addrcluster[nn][0]];
462        if(trk->signcluster[nn][1]!=0) whistomax[1024+(int)trk->addrcluster[nn][1]] = whistocomp[1024+(int)trk->addrcluster[nn][1]];            if(trk->signcluster[nn][1]!=0) whistomax[1024+(int)trk->addrcluster[nn][1]] = whistocomp[1024+(int)trk->addrcluster[nn][1]];
463        if(trk->signcluster[nn][2]!=0) whistomax[2048+(int)trk->addrcluster[nn][2]] = whistocomp[2048+(int)trk->addrcluster[nn][2]];            if(trk->signcluster[nn][2]!=0) whistomax[2048+(int)trk->addrcluster[nn][2]] = whistocomp[2048+(int)trk->addrcluster[nn][2]];
464    
465        for(Int_t i = 0; i < 3072; i++){            for(Int_t i = 0; i < 3072; i++){
466          if(whistomax[i]>-200) imax[nn]=1;              if(whistomax[i]>-200) imax[nn]=1;
467          if(whistocomp[i]>-200) icomp[nn]=1;              if(whistocomp[i]>-200) icomp[nn]=1;
468          if(whistofull[i]>-200) ifull[nn]=1;              if(whistofull[i]>-200) ifull[nn]=1;
469          histomax[nn][e]->Fill((Float_t)i,whistomax[i]);              histomax[nn][e]->Fill((Float_t)i,whistomax[i]);
470          histocomp[nn][e]->Fill((Float_t)i,whistocomp[i]);              histocomp[nn][e]->Fill((Float_t)i,whistocomp[i]);
471          histofull[nn][e]->Fill((Float_t)i,whistofull[i]);              histofull[nn][e]->Fill((Float_t)i,whistofull[i]);
472        }            }
473            
474        TBox b;            TBox b;
475        b.SetFillColor(6);  
476        b.SetFillStyle(3945);            c1[e]->cd();          
477              trkpadtext[nn]->Draw();
478        c1[e]->cd();                      trkpad[nn]->Draw();
479        trkpadtext[nn]->Draw();            trkpad[nn]->cd();
480        trkpad[nn]->Draw();            trkpad[nn]->SetFillColor(10);
481        trkpad[nn]->cd();  
482        trkpad[nn]->SetFillColor(10);            histocomp[nn][e]->GetYaxis()->SetRangeUser(-500,4500);
483              histocomp[nn][e]->SetLineStyle(1);
484        histocomp[nn][e]->GetYaxis()->SetRangeUser(-500,4500);            histocomp[nn][e]->SetLineColor(38);
485        histocomp[nn][e]->SetLineStyle(1);            histocomp[nn][e]->SetFillColor(38);
486        histocomp[nn][e]->SetLineColor(38);            histocomp[nn][e]->SetLineWidth(1);
487        histocomp[nn][e]->SetFillColor(38);            histocomp[nn][e]->Draw("");
488        histocomp[nn][e]->SetLineWidth(1);  
489        histocomp[nn][e]->Draw("");            histofull[nn][e]->SetLineColor(40);
490              histofull[nn][e]->SetFillColor(40);
491        histofull[nn][e]->SetLineColor(40);            histofull[nn][e]->SetLineWidth(1);
492        histofull[nn][e]->SetFillColor(40);            histofull[nn][e]->SetLineStyle(2);
493        histofull[nn][e]->SetLineWidth(1);  
494        histofull[nn][e]->SetLineStyle(2);            histomax[nn][e]->SetLineColor(2);
495              histomax[nn][e]->SetLineWidth(1);
496        histomax[nn][e]->SetLineColor(2);            histomax[nn][e]->SetLineStyle(3);
497        histomax[nn][e]->SetLineWidth(1);  
498        histomax[nn][e]->SetLineStyle(3);            if(ifull[nn]==1) histofull[nn][e]->Draw("9bsame][");
499              if(icomp[nn]==1) histocomp[nn][e]->Draw("9bsame][");
500        if(ifull[nn]==1) histofull[nn][e]->Draw("9bsame][");            if(imax[nn]==1) histomax[nn][e]->Draw("same][");
501        if(icomp[nn]==1) histocomp[nn][e]->Draw("9bsame][");            histocomp[nn][e]->Draw("axis same");
502        if(imax[nn]==1) histomax[nn][e]->Draw("same][");            if(nn==0){
503        histocomp[nn][e]->Draw("axis same");              b.SetFillColor(107);
504        if(nn==1){              b.SetFillStyle(3945);
505          b.DrawBox(2816.,-500.,3060.,4500.);              b.DrawBox(768.,-500.,2047.,4500.);
506        }            }
507        else if(nn==6){            else if(nn==1){
508          b.DrawBox(2560.,-500.,2816.,4500.);              b.SetFillColor(6);
509          b.DrawBox(512.,-500.,768.,4500.);              b.SetFillStyle(3945);
510          b.DrawBox(1024.,-500.,1792.,4500.);              b.DrawBox(2944.,-500.,3060.,4500.);
511        }          
512        else if(nn==11){              b.SetFillColor(107);
513          b.DrawBox(768.,-500.,1024.,4500.);              b.SetFillStyle(3954);
514                b.DrawBox(2816.,-500.,2944.,4500.);
515                b.DrawBox(2048.,-500.,2176.,4500.);
516              }
517              else if(nn==4){
518                b.SetFillColor(107);
519                b.SetFillStyle(3954);
520                b.DrawBox(384.,-500.,512.,4500.);
521              }
522              else if(nn==6){
523                b.SetFillColor(6);
524                b.SetFillStyle(3945);
525                b.DrawBox(2560.,-500.,2816.,4500.);
526                b.DrawBox(1024.,-500.,1535.,4500.);
527            
528                b.SetFillColor(107);
529                b.SetFillStyle(3954);
530                b.DrawBox(512.,-500.,768.,4500.);
531                b.DrawBox(1536.,-500.,1792.,4500.);
532              }
533              else if(nn==7){
534                b.SetFillColor(107);
535                b.SetFillStyle(3954);
536                b.DrawBox(512.,-500.,768.,4500.);
537              }
538              else if(nn==8){
539                b.SetFillColor(107);
540                b.SetFillStyle(3954);
541                b.DrawBox(512.,-500.,768.,4500.);
542              }
543              else if(nn==9){
544                b.SetFillColor(107);
545                b.SetFillStyle(3954);
546                b.DrawBox(256.,-500.,384.,4500.);
547              }
548              else if(nn==10){
549                b.SetFillColor(107);
550                b.SetFillStyle(3954);
551                b.DrawBox(2560.,-500.,3070.,4500.);
552              }
553              else if(nn==11){
554                b.SetFillColor(6);
555                b.SetFillStyle(3945);
556                b.DrawBox(768.,-500.,1024.,4500.);
557            
558                b.SetFillColor(107);
559                b.SetFillStyle(3954);
560                b.DrawBox(0.,-500.,512.,4500.);
561                b.DrawBox(1920.,-500.,2560.,4500.);
562              }
563              c1[e]->Update();
564            }
565        }        }
       c1[e]->Update();  
566        
567      }//end loop on views      }//end loop on views
568        

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.17

  ViewVC Help
Powered by ViewVC 1.1.23