BRAT 2.4.5
Class index
Full class index
brahmlib
BRAHMS
ROOT page
//____________________________________________________________________
// 
// This module is devoted to the DC detector calibration

//____________________________________________________________________
//
// $Id: BrDcCalModule.cxx,v 1.17 2002/05/07 17:35:24 ouerdane Exp $
// $Author: ouerdane $
// $Date: 2002/05/07 17:35:24 $
// $Copyright: (C) 2001 BRAHMS Collaboration <brahmlib@rhic.bnl.gov>
//

///////////////////////////////////////////////////////////////////////
//                                                                   //
// BrDcCalModule                                                     //
//                                                                   //
//                                                                   //
//                                                                   //
// BrDcCalModule is a calibration module for the                     //
// brahms drift chambers                                             // 
//                                                                   //
// It also will store data in the Calibration Database using the     //
// BrCalibrationManager                                         //
//                                                                   //
//                                                                   //
/////////////////////////////////////////////////////////////////////// 

#ifndef WIN32
#include <iostream>
#else
#include <iostream.h>
#endif
#include <iomanip.h>
#include <fstream.h>

// ROOT Includes
#ifndef ROOT_TF1
#include "TF1.h"
#endif
#ifndef ROOT_TString
#include "TString.h"
#endif
#ifndef ROOT_TMath
#include "TMath.h"
#endif
#ifndef ROOT_TDirectory
#include "TDirectory.h"
#endif

// Brat stuff
#ifndef BRAT_BrTofPedCalModule
#include "BrDcCalModule.h"
#endif
#ifndef BRAT_BrDataTable
#include "BrDataTable.h"
#endif
#ifndef BRAT_BrDcDig
#include "BrDcDig.h"
#endif
#ifndef BRAT_BrDCHit
#include "BrDCHit.h"
#endif
#ifndef BRAT_BrParameterDbManager
#include "BrParameterDbManager.h"
#endif
#ifndef BRAT_BrCalibrationManager
#include "BrCalibrationManager.h"
#endif
#ifndef BRAT_BrRunInfoManager
#include "BrRunInfoManager.h"
#endif
#ifndef BRAT_BrRunInfo
#include "BrRunInfo.h"
#endif
#ifndef BRAT_BrBbVertex
#include "BrBbVertex.h"
#endif

//________________________________________________________________________

ClassImp(BrDcCalModule);

//________________________________________________________________________
 BrDcCalModule::BrDcCalModule()
  : BrModule()
{
   //
   // default constructor
   //
  fCommitCal = kFALSE;
  fCalibration = 0;
  fGlobalTdcOffset = BrDcCalibration::kCalException;
  fDriftTime = BrDcCalibration::kCalException;
  fCalComment[0] = "";
  fCalComment[1] = "";
  fLocalTrack = 0;
}

//________________________________________________________________________
 BrDcCalModule::BrDcCalModule(Text_t *Name, Char_t *Title) 
  : BrModule(Name, Title)
{
   //
   // constructor for named object
   //
  fEvents=0;
  fCommitCal = kFALSE;
  fCalibration = 0;
  fGlobalTdcOffset = BrDcCalibration::kCalException;
  fDriftTime = BrDcCalibration::kCalException;
  fCalComment[0] = "";
  fCalComment[1] = "";
  fLocalTrack = 0;
}

//________________________________________________________________________
 BrDcCalModule::~BrDcCalModule()
{
   //
   // destructor
   //

}

//_______________________________________________________________________
 void BrDcCalModule::Init()
{
  //
  // Called once per session
  // Get detectorParameters. Inform the parameterElementManeger about
  // database tables to be used (i.e. filled).

  // DC description initialization
  // Finally it should go to BrDetectorParamsDC 

  if (fCommitCal) {
    BrCalibrationManager* calMan = BrCalibrationManager::Instance();
    fCalibration = (BrDcCalibration*)calMan->Register("BrDcCalibration", GetName());
    
    if (!fCalibration) {
      Abort("Init", "couldn't get pointer to DC calibration parameter");
      return;
    }
    
    if (fGlobalTdcOffset != BrDcCalibration::kCalException)
      fCalibration->Use("tdcOffset", BrCalibration::kWrite, 1);
    if (fDriftTime != BrDcCalibration::kCalException)
      fCalibration->Use("driftTime", BrCalibration::kWrite, 1);

    return;
  }

  fLocalTrack = new BrDCTrackingModule((Char_t*)GetName(),(Char_t*)GetName(),kFALSE);
  fLocalTrack -> UseMySql();
  fLocalTrack->Init();

  fPlaneView[0]='X'; fPlaneView[1]='Y'; fPlaneView[2]='U'; fPlaneView[3]='V';
  if(!strcmp("T3",GetName())) { // case of T3
    fNumPlanes=10;
    fWires[0]=40; fWires[1]=40; fWires[2]=40; // X view
    fWires[3]=30; fWires[4]=30; fWires[5]=30; // Y view
    fWires[6]=48; fWires[7]=48;               // U view
    fWires[8]=48; fWires[9]=48;               // V view
    
    fViewPlanes[0]=3;fViewPlanes[1]=3;fViewPlanes[2]=2;fViewPlanes[3]=2;
    
    fView[0]='X'; fView[1]='X'; fView[2]='X';
    fView[3]='Y'; fView[4]='Y'; fView[5]='Y';
    fView[6]='U'; fView[7]='U';
    fView[8]='V'; fView[9]='V';
    
    fViewNumber[0]=1; fViewNumber[1]=2; fViewNumber[2]=3;
    fViewNumber[3]=1; fViewNumber[4]=2; fViewNumber[5]=3;
    fViewNumber[6]=1; fViewNumber[7]=2;
    fViewNumber[8]=1; fViewNumber[9]=2;
    fRefDriftDist=0.5;
    cout<<"was in T3 section"<<endl;
  }else if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
    fNumPlanes=8;
      fWires[0]=23; fWires[1]=23;  // X view
      fWires[2]=16; fWires[3]=16;  // Y view
      fWires[4]=27; fWires[5]=27;  // U view
      fWires[6]=27; fWires[7]=27;  // V view
      
      fViewPlanes[0]=2;fViewPlanes[1]=2;fViewPlanes[2]=2;fViewPlanes[3]=2;
      
      fView[0]='X'; fView[1]='X'; 
      fView[2]='Y'; fView[3]='Y'; 
      fView[4]='U'; fView[5]='U';
      fView[6]='V'; fView[7]='V';

      fViewNumber[0]=1; fViewNumber[1]=2;
      fViewNumber[2]=1; fViewNumber[3]=2; 
      fViewNumber[4]=1; fViewNumber[5]=2;
      fViewNumber[6]=1; fViewNumber[7]=2;
      fRefDriftDist=1.1;
      cout<<"was in T4/5 section"<<endl;    
    }else{
      cout<<"Wrong detector name: '"<<GetName()<<"'"<<endl;
      cout<<"should be 'T3', 'T4', or 'T5'"<<endl;
    }  
   

  // driver settings 
  if(!fDCDriver)InitDCDriver();

  if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
    if(!ReadPromptDelayMap())cout<<"Prompt-Delay mapping file doesn't exist"<<endl;
  }
  

  // Job-level initialization
  SetState(kInit);



  BrModule::Init();
    
  
  // for the moment we don't use it - if you do use this
  // form!!
  //fCalibration->Use("topPedestal", BrCalibration::kWrite,fParamsTof->GetNoSlats());
  // NOT THIS.
  //fCalibration->UseForWrite("topPedestalWidth", fParamsTof->GetNoSlats());
  //fCalibration->UseForWrite("botPedestal", fParamsTof->GetNoSlats());
  //fCalibration->UseForWrite("botPedestalWidth", fParamsTof->GetNoSlats());
   
  cout<<"Initialazing BadWire matrix"<<endl; 
  for(Int_t im=0;im<3;im++){
    for(Int_t ip=0;ip<10;ip++){
      for(Int_t iw=0;iw<48;iw++){
	fBadWire[im][ip][iw]=kFALSE;
      }
    }
  }

  cout<<"BrDcCalModule from brat2"<<endl;

}

//______________________________________________________________
 void BrDcCalModule::InitDCDriver()
{
    // driver settings 
  if(!fDCDriver){
    fDCDriver = new BrDriverDC(GetName(),GetName());  
    if(!strcmp("T3",GetName())){ 
      fDCDriver->SetMinWidth(fMinWidth);
      fDCDriver->SetMinTdc(fMinTdc);
      fDCDriver->SetMaxTdc(fMaxTdc);
      fCalibChan=290;
    }
    if(!strcmp("T4",GetName()) || !strcmp("T5",GetName()) ){ 
      fDCDriver->SetMinWidth(fMinWidth);
      fDCDriver->SetMinTdc(fMinTdc);
      fDCDriver->SetMaxTdc(fMaxTdc);
      fCalibChan=460;
    }
    cout<<"Cleaning settings for "<<GetName()<<" detector: "
	<<fMinTdc<<" "<<fMaxTdc<<" "<<fMinWidth<<endl;
  }else{
    cout<<"fDCDriver already exist->??????"<<endl;
  }
}


//________________________________________________________________________
 void BrDcCalModule::DefineHistograms()
{

  //----------------------------------------------------------------------------//
  //                       one dim plots

  cout<<"booking histograms for "<<GetName()<<" detector"<<endl;
  Char_t HistName[64];
  for(Int_t imod=0;imod<3;imod++) {                 // imod denotes the module number
    for(Int_t i=0;i<fNumPlanes;i++) { // i denotes the plane number
      //cout<<"imod: "<<imod<<" ip: "<<i<<" fNum: "<<fViewNumber[i]<<endl;
      sprintf(HistName,"%s_%d_%c%d",GetName(),imod+1,fView[i],fViewNumber[i]);
      fPlane[imod][i] = new TH1F(HistName,HistName,fWires[i],.5,fWires[i]+0.5);
      fPlane[imod][i]->SetYTitle("counts"); fPlane[imod][i]->SetXTitle("wire number");
      sprintf(HistName,"%s_%d_%c%d_Time",GetName(),imod+1,fView[i],fViewNumber[i]);
      fTime[imod][i] = new TH1F(HistName,HistName,2000,0,6000);
      fTime[imod][i]->SetYTitle("dN/dt"); fTime[imod][i]->SetXTitle("time [ns]");
      //sprintf(HistName,"%s_%d_%c%d_TimeVsWidth",GetName(),imod+1,fView[i],fViewNumber[i]);
      //fTimeVsWidth[imod][i] = new TH2F(HistName,HistName,500,4000,5500,260,0,260);
    }  
  }
  sprintf(HistName,"%sAssoHits",GetName());
  fhAssoHits = new TH1F(HistName,"Associated hits for all rec. tracks",41,-.5,40.5);
  fhAssoHits->SetYTitle("counts"); fhAssoHits->SetXTitle("hits number");
  sprintf(HistName,"%sAssoHitsAcce",GetName());
  fhAssoHitsAcce = new TH1F(HistName,"Associated hits for accepted rec. tracks",41,-.5,40.5);
  fhAssoHitsAcce->SetYTitle("counts"); fhAssoHitsAcce->SetXTitle("hits number");
  sprintf(HistName,"%sHitsPerPlane",GetName());
  fhHitsPerPlane = new TH1F(HistName,"Hits Per Plane",30,0.5,30.5);
  fhHitsPerPlane->SetYTitle("counts"); fhHitsPerPlane->SetXTitle("Plane Number");
  sprintf(HistName,"%sAllTracks",GetName());
  fhAllTracks = new TH1F(HistName,"tracks",1,0.5,1.5);
}

//________________________________________________________________________
 void BrDcCalModule::Begin()
{

  // Run-level initialization
  SetState(kBegin);

  if (fCommitCal)
    return;

  if(!fLocalTrack)Failure("Begin", "can not retrive parameters from BrDCTrackingModule"); 
  fLocalTrack->Begin();
  fDCDriver->SetMinTdc((fLocalTrack->GetClusterFinder())->GetMinTdc());
  fDCDriver->SetMaxTdc((fLocalTrack->GetClusterFinder())->GetMaxTdc());
  fPromptDelay = (fLocalTrack->GetClusterFinder())->GetPromptDelay();
  fMinTdc = (fLocalTrack->GetClusterFinder())->GetMinTdc();
  fMaxTdc = (fLocalTrack->GetClusterFinder())->GetMaxTdc();

  if (fReadTdcMatrix)
    return;
  
  // check if histos are booked
  if (!HistBooked())
    Failure("Begin", "must book histograms for calibration to work"); 

}


//________________________________________________________________________
 void BrDcCalModule::Event(BrEventNode* inNode, BrEventNode* outNode)
{
  //
  // Fill the histograms that hold the Pedestal spectra 
  // for synchronization events
  // 
  // Required input e.g. : BrDataTable "DigTOF TOF1"
  //
  //
  
  
  SetState(kEvent);
  if (fCommitCal)
    return;

  if(DebugLevel() > 1)
    cout << "Entering Event() in BrDcCalModule for " 
	 << GetName() << endl;
  
  if (fReadTdcMatrix)
    return;
  
  //inNode->ListObjects();
  if(fCalibLevel)DecodeRedData(inNode);
  else           DecodeRawData(inNode);
  
 
  // get BB stuff

  BrBbVertex* bb = (BrBbVertex*)inNode->GetObject("BB Vertex");
  if (!bb) {
    bb = (BrBbVertex*)outNode->GetObject("BB Vertex");
    if (!bb) {
      if (DebugLevel() > 1)
	cout << " No beam beam stuff" << endl;
    }
  }

  if(!bb && fRunType=="AuAu")return;

  if(bb && fRunType=="AuAu"){
    if (bb->GetMethod() != 2)  // Small tubes only
      return;
    
    fT0        = bb->GetTime0();
    fZ0        = bb->GetZ0();
    fRightTime = bb->GetRightTime();
    fLeftTime  = bb->GetLeftTime();
    //cout<<"fT0,fZ0: "<<fT0<<" "<<fZ0<<endl;
  }
  //cout<<"t1: "<<fNumCleanHits<<endl;
  fEvents++;
  if(fEvents%5000==0)cout<<"Events --> "<<fEvents<<"  "<<flush;
  // for each event fill Tdc Matrix
  //if(fNumCleanHits)cout<<"entering FillTdcMatrix(): "<<fNumCleanHits<<endl;
  FillTdcMatrix();
}

//________________________________________________________________________
 void BrDcCalModule::Finish()
{
  //
  // called once per job 
  //

  // Job-level finalization
  SetState(kFinish);
  if (fCommitCal) {
    if (fGlobalTdcOffset != BrDcCalibration::kCalException) {
      Info(5, "Finish", "Committing tdc offset (%d) for %s with this comment:n  %s", 
	   fGlobalTdcOffset, GetName(), fCalComment[0].Data());
      fCalibration->SetTdcOffset(fGlobalTdcOffset);
      fCalibration->SetComment("tdcOffset", fCalComment[0].Data());
    }
    if (fDriftTime != BrDcCalibration::kCalException) {
      Info(5, "Finish", "Committing drift time (%d) for %s with this comment:n  %s", 
	   fDriftTime, GetName(), fCalComment[1].Data());
      fCalibration->SetDriftTime(fDriftTime);
      fCalibration->SetComment("driftTime", fCalComment[1].Data());
    }
    return;
  }
  
  if(!fReadTdcMatrix)SaveTdcMatrix();

  if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
    if(!fMapExist)SavePromptDelayMap();
  }
  
  if(!fReadTdcMatrix){
    SaveTdcMatrix();
    //return; // if tdc matrix was created in this run then it is enough to write it down.
  }

  FillWithTdcMatrix(1,3); // special treatment for this plane 
  
  if(fOffsetOption){
    PrepareForOffsets();
    FindTdcOffsets1New(); // summing over all wires in the plane - require PrepareForOffsets(). 
  }else{
    FindTdcOffsetsNew();
  }
  //if(!strcmp("T4",GetName()))CorrectOffsets();
  //FindTdcOffsets(); // each wire treated independly
  //FindTdcOffsetsNew();

  SaveTdcOffsets();
  Int_t CreatHist=1;
  ConstructTimeMatrix(CreatHist);
  Calibrate();
  SaveCalibData();
  

  // set parameters for eventual commit into DB
  //fCalibration->SetBotPedestal(slat, meanFit);
  //fCalibration->SetBotPedestalWidth(slat, sigmaFit);
  //fCalibration->SetComment("topPedestal","Generated by
  //BrTofPedCalModule: fit with a Gaussian function");

}


//____________________________________________________________________
 Bool_t BrDcCalModule::ReadTdcMatrix() 
{

  // save pedestal to ascii file

  // but first check if fDCDriver has already been defined
  if(!fDCDriver)InitDCDriver();
  

  fReadTdcMatrix=kFALSE;

  if (fTdcMatrixFile == "") {
    cout << "n You forgot to set a tdc matrix file for "
	 << GetName() << ".n Please provide it now: " << flush;
    cin >> fTdcMatrixFile;
    cout << endl;
    cout<<"Good Boy!"<<endl;
  }
  
  Int_t im,ip,iw,it,r; 
  ifstream IN(fTdcMatrixFile.Data(), ios::in);
  
  if(IN){
    fReadTdcMatrix=kTRUE;
    cout<<"Reading TDC Matrix"<<endl;
    do {
      IN>>im>>ip>>iw>>it>>r;
      if(!(IN.eof())){
	//if(fDCDriver->HitIsOK(it,fMinWidth)){
	  if(im==0 && ip==8 && iw>6 && iw<22)cout<<"im,ip,iw "<<im<<" "<<ip<<" "<<iw<<" not used"<<endl;
	  else fTdcMatrix[im][ip][iw][it]+=r;
	  //}
      }
    } while(!(IN.eof()));
    IN.close();
  }

  return fReadTdcMatrix;
}

//_____________________________________________________
 Bool_t BrDcCalModule::ReadPromptDelayMap() 
{

  // maping to ascii file
  

  fMapExist=kFALSE;
  
  Int_t im,ip,iw,id;
  Char_t MapFileName[64]; 
  sprintf(MapFileName,"%sPromptDelayMap.dat",GetName());
  ifstream IN(MapFileName, ios::in);
  
  if(IN){
    fMapExist=kTRUE;
    cout<<"Reading Prompt-Delay Mapping from file: "<<MapFileName<<endl;
    do {
      IN>>im>>ip>>iw>>id;
      if(!(IN.eof())){
	fDelayed[im][ip][iw]=id;
      }
    } while(!(IN.eof()));
    IN.close();
  }

  return fMapExist;
}

//_____________________________________________________________________
 void BrDcCalModule::FillTdcMatrix()
{
// This method should be called in the event loop
// to fill tdc spectrum with each new event

 Int_t NumHits=fNumCleanHits;
 for(Int_t i=0;i<NumHits;i++) {
   Int_t im = fEveTab[i][0];
   Int_t ip = fEveTab[i][1];
   Int_t iw = fEveTab[i][2];
   Int_t it = fEveTab[i][3];
   //Int_t itBB = GetTdcFromBBRef((Double_t)it);
   //cout<<"itBB: "<<itBB<<endl;
   //if(itBB>=0 && itBB<5200)fTdcMatrix[im][ip][iw][itBB]++;
   fTdcMatrix[im][ip][iw][it]++;
 }
}

//_____________________________________________________________________
 Int_t BrDcCalModule::GetTdcFromBBRef(Double_t it)
{
// it is in units of 1/2 ns

  //Int_t TimeOffset=109;
  Int_t TimeOffset=123;
  //Double_t TdcReference = (fT0) * 2.0; // TdcReferece is now in units of 500 ps
  //Double_t TdcReference = (fT0-fZ0/30.0) * 2.0;
  Double_t TdcReference = fLeftTime*2.0;
  //TdcReference=0.0;
  //cout<<TdcReference<<" "<<fZ0<<endl;
  return TMath::Nint(it + TdcReference) - TimeOffset;
}

//_____________________________________________________________________
 void BrDcCalModule::FillTdcMatrixView()
{
  // This method should be called in the event loop
  // to fill time spectrum with for each new event
  
  if(strcmp("T3",GetName())){
    cout<<"This method can not be call for "
	<<GetName()<<" detector"<<endl;
  }
  Int_t NumHits=fNumCleanHits;
  for(Int_t i=0;i<NumHits;i++) {
    Int_t im = fEveTab[i][0];
    Int_t ip = fEveTab[i][1];
    Int_t iw = fEveTab[i][2];
    Int_t it = fEveTab[i][3];
    // comment on what follow: we multiply filling of fTdcMatrix
    // to gain the statistics. It is of course temporary.
    if(fView[ip]=='X'){
      for(Int_t j=0;j<3;j++){
	//cout<<ip<<" "<<it<<endl;
	fTdcMatrix[im][j][iw][it]++; //X view
      }
    }
    if(fView[ip]=='Y'){
      for(Int_t j=3;j<6;j++){
	fTdcMatrix[im][j][iw][it]++; //Y view
      }
    }
    if(fView[ip]=='U'){
      for(Int_t j=6;j<8;j++){
	fTdcMatrix[im][j][iw][it]++; //U view
      }
    }
    if(fView[ip]=='V'){
      for(Int_t j=8;j<10;j++){
	fTdcMatrix[im][j][iw][it]++; //V view
      }
    }
    
  }
}

//_____________________________________________________________________
 void BrDcCalModule::SaveTdcMatrix()
{
  // This method write TDC matrix to the disk
  
  ofstream OUT(fTdcMatrixFile.Data(), ios::out);
  OUT.setf(ios::showpoint); 
  
  cout<<"Writing TDC Matrix"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	for(Int_t it=0;it<5200;it++) {
	  if(fTdcMatrix[im][ip][iw][it])OUT<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "
					   <<fTdcMatrix[im][ip][iw][it]<<endl;
	}   //it
      }   //iw
    }   //ip
  }   //im

 OUT.close();
}

//_____________________________________________________________________
 void BrDcCalModule::SavePromptDelayMap()
{
  // 
  
  Char_t MapFileName[64]; 
  sprintf(MapFileName,"%sPromptDelayMap.dat",GetName());
  ofstream OUT(MapFileName, ios::out); 
  
  cout<<"Writing Pprompt-Delay Mapping"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	OUT<<im<<" "<<ip<<" "<<iw<<" "<<fDelayed[im][ip][iw]<<endl;
      }   //iw
    }   //ip
  }   //im
  
  OUT.close();
}

//_____________________________________________________________________
 void BrDcCalModule::FillWithTdcMatrix(Int_t module,Int_t plane)
{
  cout<<"Filling for TDC spectra"<<endl;
  
  Char_t HistName[64];
  fDCDriver->AtPlane(plane); 
  for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
    sprintf(HistName,"%sTdcFor%d_%d_w%d",GetName(),module,plane,iw+1);
    fBTime[iw] = new TH1F(HistName,HistName,2600,2600,5200);  // to monitor time
    fBTime[iw]->SetYTitle("dN/dt");fBTime[iw]->SetXTitle("TDC Channel");
  }
  
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	for(Int_t it=fMinTdc;it<fMaxTdc;it++) {
	  fTime[im][ip]->Fill(it,fTdcMatrix[im][ip][iw][it]);
	  fPlane[im][ip]->Fill(iw+1,fTdcMatrix[im][ip][iw][it]);
	  if(im==module && ip==plane)fBTime[iw]->Fill(it,fTdcMatrix[im][ip][iw][it]);  
	}     //it
      }     //iw
    }     //ip
  }     //im
} 

//_____________________________________________________________________
 void BrDcCalModule::PrepareForOffsets()
{
  // If you want to perform individual calibration for a single
  // plane, first sum fTdcMatrix over wires. This method should be
  // called befor calling FindTdcOffsets1(). 
 
   cout<<"Summing TdcMatrix over wires "<<endl;
   for(Int_t im=0;im<3;im++){
     for(Int_t ip=0;ip<fNumPlanes;ip++){
       fDCDriver->AtPlane(ip);
       for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++){
	 Int_t id=0;
	 if(!strcmp("T4",GetName()) || !strcmp("T5",GetName()))id=fDelayed[im][ip][iw];
	 for(Int_t it=3000;it<6000;it++){
	   fForOffsets[im][ip][id][it] += fTdcMatrix[im][ip][iw][it];
	 }
       }
     }
   }
}

//_____________________________________________________________
 void BrDcCalModule::FindTdcOffsets()
{
  // This method looks for tdc channel number that refers to
  // zero drift distance (time). Here we treated each channel (wire) independly.
  
  cout<<"Looking for TDC offsets"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	Int_t it=5199;
	Int_t nstep=0;
	Int_t sum=0;
	Float_t mean,meanLow=0.0;
	Int_t next;
	Int_t current;
	Int_t prev0,prev1,prev2;
	do {
	  nstep++;
	  sum += fTdcMatrix[im][ip][iw][it];
	  mean = (Float_t)sum/(Float_t)nstep;
	  if(it>4960)meanLow=mean;
	  if(it<4625 && it>4450)meanLow=mean;
	  if(it==4570)mean=0;
	  next=fTdcMatrix[im][ip][iw][it-10];
	  it--;
	} while((mean<meanLow*3.0 || mean==0 || it>5000 ) && it>fMinTdc);
	
	do {
	  prev2=fTdcMatrix[im][ip][iw][it-3];
	  prev1=fTdcMatrix[im][ip][iw][it-2];
	  prev0=fTdcMatrix[im][ip][iw][it-1];
	  current=fTdcMatrix[im][ip][iw][it];
	  it++;
	  next=fTdcMatrix[im][ip][iw][it];
	} while((0.2*(prev2+prev1+prev0+current+next) > mean*2.3) && it+1<fMaxTdc);
	
	fOffset[im][ip][iw]=it; // Is it realy enough?
	//if(im==2 && ip==6)cout<<"      "<<it<<endl;
	//if(im==2 && ip==6){Int_t ii; cin>>ii;}
      }   //iw
    }   //ip
  }   //im
}

//_____________________________________________________________
 void BrDcCalModule::FindTdcOffsetsNew()
{
  // This method looks for tdc channel number that refers to
  // zero drift distance (time). Each wire is treated independly.
  
  Bool_t WireHasProblem[48];
  Float_t Param=.5;
  Float_t param;
  cout<<"FindTdcOffsetsNew::Looking for TDC offsets"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      cout<<"Looking for offsets for plane "<<ip<<" in module "<<im<<endl;
      //param=Param;
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	WireHasProblem[iw]=kFALSE;
	param=Param;
	Int_t id = 0;
	Int_t MaxTdc = fMaxTdc;
	Int_t MinTdc = fMinTdc;
	if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
	  id=fDelayed[im][ip][iw];
	  //if(iw && id!=fDelayed[im][ip][iw-1])param=Param;
	  if(id){
	    MaxTdc=fPromptDelay;
	    MinTdc=fMinTdc;
	  }else{
	    MaxTdc=fMaxTdc;
	    MinTdc=fPromptDelay;
	  }
	}

	Int_t it;
	Int_t nstep=0;
	Int_t sum=0;
	Float_t mean,meanLow;
	Int_t next;
	Int_t current;
	Int_t prev0,prev1,prev2;
	Bool_t Continue;
	do {
	  it=MaxTdc;
	  meanLow=0.0;
	  do {
	    nstep++;
	    sum += fTdcMatrix[im][ip][iw][it];
	    mean = (Float_t)sum/(Float_t)nstep;  
	    next=fTdcMatrix[im][ip][iw][it-1];
	    Int_t nextP3=fTdcMatrix[im][ip][iw][it-3];
	    Int_t nextP4=fTdcMatrix[im][ip][iw][it-4];
	    Int_t nextP5=fTdcMatrix[im][ip][iw][it-5];
	    Int_t nextP6=fTdcMatrix[im][ip][iw][it-6];
	    Continue = (next<=sum*param || nextP3<=sum*param ||  nextP4<=sum*param 
			       || nextP5<=sum*param || nextP6<=sum*param); 
	    it--;
	  } while((Continue || mean==0 || it>MaxTdc-40) && it>MinTdc);

	  if(MinTdc+10>it)param-=0.01;
	  //cout<<param<<endl;
        }while (MinTdc+10>it && param>0);
	
	if(param<0){
	  cout<<"FindOffsets: procedure has problem for (im,ip,iw) "<<im<<" "<<ip<<" "<<iw<<" "<<param<<endl;
	  WireHasProblem[iw]=kTRUE;
	}
	
	fOffset[im][ip][iw]=it+10; // Is it realy enough?
	//cout<<"im,ip,iw,offset "<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "<<id<<endl;
	//if(im==2 && ip==6)cout<<"      "<<it<<endl;
	//if(im==2 && ip==6){Int_t ii; cin>>ii;}
      }   //iw
      if(Param!=param)cout<<"FindOffsets: Offset finding param corrected(im,ip): "
			  <<im<<" "<<ip<<" "<<Param<<" "<<param<<endl;
      //cout<<WireHasProblem<<endl;
      CheckAllWiresInPlane(im,ip,WireHasProblem);
    }   //ip
  }   //im
}

//_____________________________________________________________
 void BrDcCalModule::CheckAllWiresInPlane(Int_t im,Int_t ip,Bool_t* wsk)
{
  for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++){
    if(*wsk){
      fBadWire[im][ip][iw]=kTRUE;
      //take the closest offsets
      Bool_t OffsetCorrected=kFALSE;
      Int_t i=1;
      if(iw<fDCDriver->GetMaxWireNum()/2){
	
	do{
	  if(!*(wsk+i)){
	    fOffset[im][ip][iw]=fOffset[im][ip][iw+i];
	    OffsetCorrected=kTRUE;
	    cout<<"Offset for wire "<<iw<<" in plane "<<ip
		<<" and module "<<im<<" has been corrected ("<<iw+i<<")"<<endl;
	  }
	  i++;
	}while(!OffsetCorrected);
	
      }else{
	
	do{
	  if(!*(wsk-i)){
	    fOffset[im][ip][iw]=fOffset[im][ip][iw-i];
	    OffsetCorrected=kTRUE;
	    cout<<"Offset for wire "<<iw<<" in plane "<<ip
		<<" and module "<<im<<" has been corrected ("<<iw-i<<")"<<endl;
	  }
	  i++;
	}while(!OffsetCorrected);
      }
    }
    wsk++;
  }
}
//_____________________________________________________________
 void BrDcCalModule::FindTdcOffsets1()
{
  // This method looks for tdc channel number that refers to
  // zero drift distance (time). Here we look for offsets ofter summing
  // over all wires in particular plane. This approximation is useful
  // in the case of low statistics
  
  cout<<"Looking for TDC offsets (1)"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	Int_t id = 0;
	Int_t MaxTdc = fMaxTdc;
	Int_t MinTdc = fMinTdc;
	if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
	  id=fDelayed[im][ip][iw];
	  if(id){
	    MaxTdc=fPromptDelay;
	    MinTdc=fMinTdc;
	  }else{
	Int_t MaxTdc = fMaxTdc;
	    MaxTdc=fMaxTdc;
	    MinTdc=fPromptDelay;
	  }
	}
	Int_t it=MaxTdc;
	Int_t nstep=0;
	Int_t sum=0;
	Float_t mean,meanLow=0.0;
	Int_t next;
	Int_t current;
	Int_t prev0,prev1,prev2;
	do {
	  nstep++;
	  sum += fForOffsets[im][ip][id][it];
	  mean = (Float_t)sum/(Float_t)nstep;
	  //if(it>4960)meanLow=mean;
	  //if(it<4625 && it>4450)meanLow=mean;
	  //if(it==4570)mean=0;
          if(it>MaxTdc-70)meanLow=mean;  
	  next=fForOffsets[im][ip][id][it-10];
	  it--;
	  //} while((mean<meanLow*3.0 || mean==0 || it>5000 ) && it>fMinTdc);
	} while((mean<meanLow*3.0 || mean==0 || it>fMaxTdc-50) && it>MinTdc);
	
	//if(im==2 && ip==6)cout<<ip<<" "<<iw<<" "<<it<<endl;
	
	do {
	  prev2=fForOffsets[im][ip][id][it-3];
	  prev1=fForOffsets[im][ip][id][it-2];
	  prev0=fForOffsets[im][ip][id][it-1];
	  current=fForOffsets[im][ip][id][it];
	  it++;
	  next=fForOffsets[im][ip][id][it];
	  //} while((0.2*(prev2+prev1+prev0+current+next) > mean*2.3) && it+1<MaxTdc);
	} while((0.2*(prev2+prev1+prev0+current+next) > mean*1000.) && it+1<MaxTdc);
	
	fOffset[im][ip][iw]=it; // Is it realy enough?
	//cout<<"im,ip,iw,offset "<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "<<id<<endl;
	//if(im==2 && ip==6)cout<<"      "<<it<<endl;
	//if(im==2 && ip==6){Int_t ii; cin>>ii;}
      }   //iw
    }   //ip
  }   //im
}

//_____________________________________________________________
 void BrDcCalModule::FindTdcOffsets1New()
{
  // This method looks for tdc channel number that refers to
  // zero drift distance (time). Here we look for offsets ofter summing
  // over all wires in particular plane. This approximation is useful
  // in the case of low statistics
  
  Float_t Param=.5;
  Float_t param;
  cout<<"Looking for TDC offsets (1)"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      param=Param;
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	Int_t id = 0;
	Int_t MaxTdc = fMaxTdc;
	Int_t MinTdc = fMinTdc;
	if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
	  id=fDelayed[im][ip][iw];
	  if(iw && id!=fDelayed[im][ip][iw-1])param=Param;
	  if(id){
	    MaxTdc=fPromptDelay;
	    MinTdc=fMinTdc;
	  }else{
	    MaxTdc=fMaxTdc;
	    MinTdc=fPromptDelay;
	  }
	}

	Int_t it;
	Int_t nstep=0;
	Int_t sum=0;
	Float_t mean,meanLow;
	Int_t next;
	Int_t current;
	Int_t prev0,prev1,prev2;
	do {
	  it=MaxTdc;
	  meanLow=0.0;
	  do {
	    nstep++;
	    sum += fForOffsets[im][ip][id][it];
	    mean = (Float_t)sum/(Float_t)nstep;
	    //if(it>4960)meanLow=mean;
	    //if(it<4625 && it>4450)meanLow=mean;
	    //if(it==4570)mean=0;
	    if(it>MaxTdc-70)meanLow=mean;  
	    next=fForOffsets[im][ip][id][it-1];
	    it--;
	    //} while((mean<meanLow*3.0 || mean==0 || it>5000 ) && it>fMinTdc);
	  } while((next<sum*param || mean==0 || it>fMaxTdc-50) && it>MinTdc);

	  if(MinTdc+10>it)param-=0.01;
	  //cout<<param<<endl;
        }while (MinTdc+10>it);
	
	if(MinTdc+10>it && iw==10)
	  cout<<"FindOffsets: procedure failed for (im,ip) "<<im<<" "<<ip<<endl;
	
	
	fOffset[im][ip][iw]=it+10; // Is it realy enough?
	//cout<<"im,ip,iw,offset "<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "<<id<<endl;
	//if(im==2 && ip==6)cout<<"      "<<it<<endl;
	//if(im==2 && ip==6){Int_t ii; cin>>ii;}
      }   //iw
      if(Param!=param)cout<<"FindOffsets: Offset finding param corrected(im,ip): "
			  <<im<<" "<<ip<<" "<<Param<<" "<<param<<endl;
    }   //ip
  }   //im
}

//______________________________________________________________________
 void BrDcCalModule::CorrectOffsets()
{
  if(!strcmp("T4",GetName())){
    Int_t OffsetCorrD[]=
    {40, 35, 35,  0, 47,  0, 47, 20,
       57,  0,  0, 45, 47, 60, 40, 14,
       40, 50,  0, 50, 40, 24, 40, 15};

    Int_t OffsetCorrP[]=
    { 0, 24,  0, 18, 22, 20, 20, 19,
       18, 20, 20,  0,  0, 20,  0, 16,
        0, 28, 23,  0, 22, 24, 15, 18};

    for(Int_t im=0;im<3;im++) {
      for(Int_t ip=0;ip<fNumPlanes;ip++) {
	fDCDriver->AtPlane(ip);  
	for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	  Int_t id=fDelayed[im][ip][iw];
	  if(id)fOffset[im][ip][iw] -=  OffsetCorrD[im*fNumPlanes + ip];
	  else fOffset[im][ip][iw] -=  OffsetCorrP[im*fNumPlanes + ip];
	}   //iw
      }   //ip
    }   //im 
  }  
}


//_____________________________________________________________________
 void BrDcCalModule::SaveTdcOffsets()
{
  // This method write TDC offsets to the disk
  
  ofstream OUT(fOffsetFile.Data(),ios::out);
  OUT.setf(ios::showpoint);
  
  cout<<"Writing Offsets Data"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);  
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	if(fOffset[im][ip][iw])OUT<<im<<" "<<ip<<" "<<iw<<" "<<fOffset[im][ip][iw]<<endl;
      }   //iw
    }   //ip
  }   //im
  
  OUT.close();
  
}

//__________________________________________________________________
 void BrDcCalModule::ConstructTimeMatrix(Int_t opt)
{
  // here we construct time matrix 
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      fDCDriver->AtPlane(ip);
      for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	Int_t Offset=fOffset[im][ip][iw];
	Int_t MinTdc=fMinTdc;
	if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
	  if(!fDelayed[im][ip][iw])MinTdc=fPromptDelay;
	}
	for(Int_t it=0;it<720;it++) {
	  Int_t il = Offset-it;
	  //if(Offset<4600 && Offset>3000) {  // corrections for strange working channels
	  //  if(il<4096 && il+512>Offset)il=il+512;
	  //}
	  // Now we can jump from tdc to drift time:
	  if(il>MinTdc)
	    fTimeMatrix[im][ip][iw][it]=fTdcMatrix[im][ip][iw][il];  
	}    //it
      }    //iw
    }    //ip
  }    //im
  
  if(opt) {
    cout<<"Filling Calib. Histograms, it can takes a while"<<endl;
    Char_t HistName[64];
    for(Int_t im=0;im<3;im++) {
      for(Int_t ip=0;ip<fNumPlanes;ip++) {
	// time
	sprintf(HistName,"%sTime_m%d_p%d",GetName(),im+1,ip+1);
	fTimeDist[im][ip] = new TH1F(HistName,HistName,500,0,1000);  // to monitor time
	fTimeDist[im][ip]->SetYTitle("dN/dt");fTimeDist[im][ip]->SetXTitle("TDC Channel");
	sprintf(HistName,"%sTime_m%d_p%dD",GetName(),im+1,ip+1);
	fTimeDistD[im][ip] = new TH1F(HistName,HistName,500,0,1000);  // to monitor time
	fTimeDistD[im][ip]->SetYTitle("dN/dt");fTimeDist[im][ip]->SetXTitle("TDC Channel");
	sprintf(HistName,"%sTime_m%d_p%dP",GetName(),im+1,ip+1);
	fTimeDistP[im][ip] = new TH1F(HistName,HistName,500,0,1000);  // to monitor time
	fTimeDistP[im][ip]->SetYTitle("dN/dt");fTimeDist[im][ip]->SetXTitle("TDC Channel");
	// Offset
	sprintf(HistName,"%sOffset_m%d_p%d",GetName(),im+1,ip+1);
	fhOffset[im][ip] = new TH1F(HistName,HistName,48,0.5,48.5);  // to monitor time
	fhOffset[im][ip]->SetYTitle("TDC Offset");fhOffset[im][ip]->SetXTitle("Wire Number");  
	fDCDriver->AtPlane(ip);
	for(Int_t iw=0;iw<fDCDriver->GetMaxWireNum();iw++) {
	  fhOffset[im][ip]->Fill(iw+1,fOffset[im][ip][iw]);
	  //if(im==2 && ip==6)cout<<HistName<<" "<<fOffset[im][ip][iw]<<endl;
	  Int_t id=fDelayed[im][ip][iw];
	  for(Int_t it=0;it<1000;it++) {         
	    fTimeDist[im][ip]->Fill(it,fTimeMatrix[im][ip][iw][it]);
	    if(id)fTimeDistD[im][ip]->Fill(it,fTimeMatrix[im][ip][iw][it]);
	    else fTimeDistP[im][ip]->Fill(it,fTimeMatrix[im][ip][iw][it]);
	  }    //it
	}    //iw
      }    //ip
    }    //im
  }
}

//__________________________________________________________________
 void BrDcCalModule::Calibrate()
{
  
  Int_t CalibChan=fCalibChan;
  
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      TimeIntegral(im,ip); // here we integrate over wires in plane
      //TimeIntegral(im,ip,iw);
    }
  }
  if(CalibChan) {    
    Char_t HistName[64];    
    for(Int_t im=0;im<3;im++) {
      for(Int_t ip=0;ip<fNumPlanes;ip++) {        
        sprintf(HistName,"%sInteg_m%d_p%d",GetName(),im+1,ip+1);
        fInteg[im][ip] = new TH1F(HistName,HistName,500,0,1000);  // monitor calibration
        fInteg[im][ip]->SetYTitle("drift distance [cm]");
	fInteg[im][ip]->SetXTitle("TDC Channel");
	//cout<<"im,ip "<<im+1<<" "<<ip+1<<" "<<fInteg[im][ip]<<endl;
        for(Int_t it=0;it<1000;it++) {
          fCalib[im][ip][it]=(Float_t)fIntegral[im][ip][it]/
	    (Float_t)fIntegral[im][ip][CalibChan] * fRefDriftDist;
	  Float_t factor=1.0/fInteg[im][ip]->GetBinWidth(1);
          fInteg[im][ip]->Fill(it,factor*fCalib[im][ip][it]);
	}
      }
    }
  }
  
}

//__________________________________________________________________
 void BrDcCalModule::TimeIntegral(Int_t im,Int_t ip,Int_t iw)
{
// This method produced integrated spectrum for
// the chosen wire

  for(Int_t it=0;it<1000;it++) {
    Int_t Sum=0;
    for(Int_t i=0;i<it;i++) {
      Sum += fTimeMatrix[im][ip][iw][i];
    }
    fIntegral[im][ip][it] = Sum;
  }

}

//__________________________________________________________________
 void BrDcCalModule::TimeIntegral(Int_t im,Int_t ip)
{
// This method produced integrated spectrum for
// the chosen wire

  
  for(Int_t it=0;it<1000;it++) {
    Int_t Sum=0;
    for(Int_t i=0;i<it;i++) {
      for(Int_t iw=1;iw<fWires[ip]-1;iw++){ 
	// the most side wires are exluded
	if(!fBadWire[im][ip][iw])Sum += fTimeMatrix[im][ip][iw][i];
      } 
    }
    fIntegral[im][ip][it] = Sum;
  }

}

//_____________________________________________________________________
 void BrDcCalModule::SaveCalibData()
{
  // This method write matrix to the disk
  
  ofstream OUT(fCalibFile.Data(),ios::out);
  OUT.setf(ios::showpoint);
  
  cout<<"Writing Calibration Data"<<endl;
  for(Int_t im=0;im<3;im++) {
    for(Int_t ip=0;ip<fNumPlanes;ip++) {
      for(Int_t it=0;it<1000;it++) {
	if(fCalib[im][ip][it])OUT<<im<<" "<<ip<<" "<<it<<" "
				 <<fCalib[im][ip][it]<<endl;
      }   //it
    }   //ip
  }   //im
  OUT.close();  
}

 void BrDcCalModule::DecodeRawData(BrEventNode* inNode)
{
  // here we decode a raw data event and keep information in
  // private member matrix fEveTab
  
  BrDataTable *dctable_p;
  if ((dctable_p = inNode->GetDataTable(Form("DigDC %s", GetName())))) {
    Int_t nhit = dctable_p->GetEntries();
    if(nhit>1999) return;
    //cout<<"Hits Numb: "<<nhit<<endl;
    Int_t ii=0;
    for(Int_t i = 0; i < nhit; i++) {
      BrDcDig* digdc_p = (BrDcDig*)dctable_p->At(i);
      Int_t im  =  digdc_p->GetSubModule() - 1;
      Int_t ip  =  digdc_p->GetPlane() - 1;
      Int_t iw  =  digdc_p->GetWire() - 1;
      Int_t it  =  digdc_p->GetTime();
      Int_t il  =  digdc_p->GetWidth(); 
      //cout<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "<<il<<endl;
      // some cleaning:
      // T3 section
      if(!strcmp("T3",GetName())){
	if(fDCDriver->HitIsOK(it,il)){
	  fEveTab[ii][0]=im;
	  fEveTab[ii][1]=ip;
	  fEveTab[ii][2]=iw;
	  fEveTab[ii][3]=it;
	  fEveTab[ii][4]=il;
	  ii++;
	}
      }
      // T4/T5 section
      if(!strcmp("T4",GetName()) || !strcmp("T5",GetName())){
	Int_t PromptDelay=fPromptDelay;
	if(fDCDriver->HitIsOK(it,il)){
	  if(PromptDelay){
	    if(iw<100){
	      if(it>PromptDelay){
		fEveTab[ii][0]=im;
		fEveTab[ii][1]=ip;
		fEveTab[ii][2]=iw;
		fEveTab[ii][3]=it;
		fEveTab[ii][4]=il;
		fDelayed[im][ip][iw]=0;
		ii++;
	      }
	    }else{
	      if(it<=PromptDelay){
		iw=iw%100;
		fEveTab[ii][0]=im;
		fEveTab[ii][1]=ip;
		fEveTab[ii][2]=iw;
		fEveTab[ii][3]=it;
		fEveTab[ii][4]=il;
		fDelayed[im][ip][iw]=1;
		ii++;
	      }
	    }
	    //cout<<im<<" "<<ip<<" "<<iw<<" "<<it<<" "<<il<<endl;
	  }else{
	    fEveTab[ii][0]=im;
	    fEveTab[ii][1]=ip;
	    fEveTab[ii][2]=iw%100;
	    fEveTab[ii][3]=it;
	    fEveTab[ii][4]=il;
	    fDelayed[im][ip][iw]=iw/100;
	    ii++;
	  }
	}
      }
    }
    fNumCleanHits=ii;
  }
}

//_____________________________________________________________________________
 void BrDcCalModule::DecodeRedData(BrEventNode* inNode)
{
  // here we decode a reduced data event and keep information in
  // private member matrix fEveTab

  //inNode->ListObjects();
  BrDataTable *AssoHitsTable;
  if ((AssoHitsTable = inNode->GetDataTable(Form("AssociatedHits %s", GetName())))) {
    Int_t nhit = AssoHitsTable->GetEntries();
    Int_t ii=0;
    Int_t hitsAssoWithThisTrack=0;
    Int_t IdSave=0;
    for(Int_t i=0;i<nhit;i++){
      BrDCHit* hit = (BrDCHit*)AssoHitsTable->At(i);
      Int_t im = hit->GetImod()/100 - 1;
      Int_t Id=hit->GetID();
      if(Id != IdSave)fhAllTracks->Fill(1);
      if(Id != IdSave && i){
	// we have a new track
	fhAssoHits->Fill(hitsAssoWithThisTrack);
	if(hitsAssoWithThisTrack<fMinAssoHits)ii=ii-hitsAssoWithThisTrack;
	else fhAssoHitsAcce->Fill(hitsAssoWithThisTrack);
	hitsAssoWithThisTrack=0;
      }
      for(Int_t j=0;j<hit->GetNumCombined();j++){
	if(ii>1999)continue;
	fEveTab[ii][0]=im;
	fEveTab[ii][1]=hit->GetPlane()[j];
	fEveTab[ii][2]=hit->GetWire()[j];
	fEveTab[ii][3]=hit->GetTdc()[j]; // tdcUseful = fT0 - fEveTab[ii][3]
	//cout<<im<<" "<<hit->GetPlane()[j]<<" "<<hit->GetTdc()[j]<<endl;
	Int_t plane = im*fNumPlanes + fEveTab[ii][1]+1;
	fhHitsPerPlane->Fill(plane);
	hitsAssoWithThisTrack++;
	ii++; 
      }
      IdSave=hit->GetID();
    }
    fhAssoHits->Fill(hitsAssoWithThisTrack);
    if(hitsAssoWithThisTrack<fMinAssoHits)ii=ii-hitsAssoWithThisTrack;
    else fhAssoHitsAcce->Fill(hitsAssoWithThisTrack);
    if(ii<2000)fNumCleanHits=ii;
    else fNumCleanHits=0;
  }
}

      
//____________________________________________________________________
 void BrDcCalModule::Print(Option_t* option) const
{
  // Print module information
  // See BrModule::Print for options.
  // In addition this module defines the Option:
  // <fill in here>

  TString opt(option);
  opt.ToLower(); 
  
  BrModule::Print(option); 
  if (opt.Contains("d")) 
   cout << endl 
         << "  Original author: Pawel Staszel" << endl
         << "  Last Modifications: " << endl 
         << "    $Author: ouerdane $" << endl  
         << "    $Date: 2002/05/07 17:35:24 $"   << endl 
         << "    $Revision: 1.17 $ " << endl  
         << endl 
         << "-------------------------------------------------" << endl;
}


//------------------------------------------------

// $Log: BrDcCalModule.cxx,v $
// Revision 1.17  2002/05/07 17:35:24  ouerdane
// added driftTime parameter to DB and classes
//
// Revision 1.16  2002/05/02 14:59:41  ufstasze
// Added fLocalTrack to retrieve global tdc offset from db
//
// Revision 1.15  2002/03/07 17:49:19  ouerdane
// added BrDcCalibration and connection to DB
//
// Revision 1.14  2002/02/15 16:09:28  ufstasze
// Changes to method that looks for Tdc offsets.
//
// Revision 1.13  2002/02/06 18:53:56  ufstasze
// updates that have to do with pp calibration
//
// Revision 1.12  2001/12/07 21:22:04  videbaek
// Change UserForRead to Use( ,mode,..)
//
// Revision 1.11  2001/11/19 17:32:48  ufstasze
// added FindTdcOffsetsNew
//
// Revision 1.10  2001/11/02 15:29:20  staszel
// Reorganized data decoding. Now decoding can be done by using
// DecodeRedData or DecodeRawData depending on the value of fCalibLevel
// parameter.
//
// Revision 1.9  2001/10/08 11:27:38  cholm
// Changed to use new DB access classes
//
// Revision 1.8  2001/09/07 14:27:33  staszel
// Added new method FindTdcOffsets1New (rather temporary).
//
// Revision 1.6  2001/08/23 11:28:29  staszel
// Some diagnostic histograms plus CorrectOffsets method.
//
// Revision 1.5  2001/08/13 11:46:35  staszel
// Same small changes.
//
// Revision 1.4  2001/07/30 11:37:47  staszel
// developments regarding T4 and T5 calibration
//
// Revision 1.3  2001/07/20 17:25:58  krakow
// Changes related to BrDriverDC
//
// Revision 1.2  2001/06/22 17:38:50  cholm
// Minor changes
//
// Revision 1.1.1.1  2001/06/21 14:55:05  hagel
// Initial revision of brat2
//
// Revision 1.2  2001/06/14 13:03:53  staszel
// first cosmetic upgrade
//
// Revision 1.1  2001/06/14 12:31:53  staszel
// Initial release of DC calibration code
//

This page automatically generated by script docBrat by Christian Holm

Copyright ; 2002 BRAHMS Collaboration <brahmlib@rcf.rhic.bnl.gov>
Last Update on by

Validate HTML
Validate CSS