21-nov-2007 NvE (De)calibration functions reset to 0 in IceMakeHits to indicate uncal...
authornick <nick@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 21 Nov 2007 15:30:36 +0000 (15:30 +0000)
committernick <nick@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 21 Nov 2007 15:30:36 +0000 (15:30 +0000)
                data. This will allow correct re-processing of IceMakeHits on already calibrated
                signals.
21-nov-2007 GdV Global time offset corrections for real data performed in IceRoot.

RALICE/icepack/IceMakeHits.cxx
RALICE/icepack/IceMakeHits.h
RALICE/icepack/history.txt
RALICE/icepack/iceconvert/IceDB2Root.cxx
RALICE/icepack/iceconvert/IceRoot.cxx
RALICE/icepack/iceconvert/IceRoot.h
RALICE/icepack/iceconvert/history.txt

index 26a2674..165e6c1 100644 (file)
@@ -314,6 +314,13 @@ void IceMakeHits::Amanda()
   if (!omx) continue;
   // Remove all existing hits of this OM 
   omx->RemoveHits();
+  // Reset (de)calibration functions to indicate uncalibrated data
+  omx->SetCalFunction(0,"ADC");
+  omx->SetCalFunction(0,"LE");
+  omx->SetCalFunction(0,"TOT");
+  omx->SetDecalFunction(0,"ADC");
+  omx->SetDecalFunction(0,"LE");
+  omx->SetDecalFunction(0,"TOT");
   // Should we skip OMs that we know from the dbase to have problems ?
 ////  if (omx->GetDeadValue("ADC") || omx->GetDeadValue("LE") || omx->GetDeadValue("TOT")) continue;
 
@@ -559,6 +566,13 @@ void IceMakeHits::IceCube()
   if (!omx) continue;
   // Remove all existing hits of this OM 
   omx->RemoveHits();
+  // Reset (de)calibration functions to indicate uncalibrated data
+  omx->SetCalFunction(0,"ADC");
+  omx->SetCalFunction(0,"LE");
+  omx->SetCalFunction(0,"TOT");
+  omx->SetDecalFunction(0,"ADC");
+  omx->SetDecalFunction(0,"LE");
+  omx->SetDecalFunction(0,"TOT");
   // Should we skip OMs that we know from the dbase to have problems ?
 ////  if (omx->GetDeadValue("ADC") || omx->GetDeadValue("LE") || omx->GetDeadValue("TOT")) continue;
 
@@ -767,13 +781,3 @@ void IceMakeHits::IceCube()
  delete[] index;
 }
 ///////////////////////////////////////////////////////////////////////////
-//void IceMakeHits::InIce()
-//{
-// Hit extraction from IceTop InIce ATWD data.
-//}
-///////////////////////////////////////////////////////////////////////////
-//void IceMakeHits::IceTop()
-//{
-// Hit extraction from IceTop ATWD data.
-//}
-///////////////////////////////////////////////////////////////////////////
index 6750b5b..f61e5c6 100644 (file)
@@ -55,8 +55,6 @@ class IceMakeHits : public TTask
   Float_t fThresholdI;           // The threshold to be used in analysis of narrow pulses in InIce ATWD hit extraction
   void Amanda();                 // Hit extraction from Amanda TWR data
   void IceCube();                // Hit extraction from IceCube ATWD data
-//  void InIce();                  // Hit extraction from IceCube InIce ATWD data
-//  void IceTop();                 // Hit extraction from IceTop ATWD data
 
  ClassDef(IceMakeHits,3) // TTask derived class to perform hit extraction from waveforms
 };
index 59ba8ee..910736a 100644 (file)
                 "A" or "I" in the trackname to indicate Amanda (OM) or InIce (DOM) tracks, resp.
                 Also the memberfunctions SetMaxModA(), SetMaxModI() etc... of IceLinefit
                 have been integrated in memberfunctions SetMaxMod() etc... 
+21-nov-2007 NvE (De)calibration functions reset to 0 in IceMakeHits to indicate uncalibrated
+                data. This will allow correct re-processing of IceMakeHits on already calibrated
+                signals.
                  
index 4cdb6cb..5ed14ee 100644 (file)
@@ -1198,24 +1198,437 @@ void IceDB2Root::GetTWRDaqData()
 void IceDB2Root::GetJEBTDaqData()
 {
 // Obtain all the JEB TWRDaq geometry, calibration and Xtalk data.
-// For the time being, the JEBTDaq database is just a copy of the
-// TWRDaq database. If different calibrations are needed in the 
-// future, this member function can be updated accordingly.
+
+ // Connect to the DB server
+ TSQLServer* server=TSQLServer::Connect(fDBName.Data(),fUser.Data(),fPassword.Data()); 
+ if (!server)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Database " << fDBName.Data() << " could not be accessed." << endl;
+  return;
+ }
 
  // The JEBTDaq OM database object
  if (fJEBTDaqdb)
  {
-  delete fJEBTDaqdb;
-  fJEBTDaqdb=0;
+  fJEBTDaqdb->Reset();
  }
-
- // Copy TWRDaq database to JEBTDaq database via the Clone() function
- if(!fTWRDaqdb) GetTWRDaqData();
- if(fTWRDaqdb)
+ else
  {
-  fJEBTDaqdb=(AliObjMatrix*)fTWRDaqdb->Clone();
+  fJEBTDaqdb=new AliObjMatrix();
   fJEBTDaqdb->SetNameTitle("JEBTDaq-OMDBASE","The JEBTDaq OM geometry, calib. etc... database");
+  fJEBTDaqdb->SetOwner();
+ }
+
+ // Prescription of the various (de)calibration functions
+
+ // Conversion of adc to charge in nC
+ // Volt per digit = 5/4096    Assumed capacitance = 20 pF
+ // Charge (in nC) is adc*(5./4096.)*0.02
+ // The database calibration constant is the amount of nC per photon electron (nC/PE)
+ TF1 fadccal("fadccal","x*(5./4096.)/(50.*[0])");
+ TF1 fadcdecal("fadcdecal","x*(50.*[0])/(5./4096.)");
+ fadccal.SetParName(0,"nC/PE");
+ fadcdecal.SetParName(0,"nC/PE");
+
+ TF1 ftdccal("ftdccal","x-[0]");
+ TF1 ftdcdecal("ftdcdecal","x+[0]");
+ ftdccal.SetParName(0,"T0");
+ ftdcdecal.SetParName(0,"T0");
+
+ TF1 ftotcal("ftotcal","x");
+ TF1 ftotdecal("ftotdecal","x");
+
+ // The cross talk probability function
+ TF1 fxtalkp("fxtalkp","(1.+[2]-[2]+[3]-[3])/(1.+exp(([0]-x)/[1]))");
+ fxtalkp.SetParName(0,"C");
+ fxtalkp.SetParName(1,"B");
+ fxtalkp.SetParName(2,"dLE-min");
+ fxtalkp.SetParName(3,"dLE-max");
+
+ // The basic OM contents
+ IceAOM om;
+
+ // Slots to hold the various (de)calibration functions
+ om.AddNamedSlot("ADC");
+ om.AddNamedSlot("LE");
+ om.AddNamedSlot("TOT");
+ // Slots with hardware parameters
+ om.AddNamedSlot("TYPE"); // -1=unknown 0=std_coax 1=std_twisted/std_hybrid 2=desy_hybrid 3=uci_fiber 4=lbl_dom 5=dAOM_ld 6=dAOM_led 9=desy_active_fiber
+ om.AddNamedSlot("ORIENT");
+ om.AddNamedSlot("THRESH");
+ om.AddNamedSlot("SENSIT");
+ om.AddNamedSlot("READOUT"); // 0=unknown 1=electrical 2=optical 3=digital
+ om.AddNamedSlot("BINSIZE");
+ om.AddNamedSlot("EXTSTOP");
+ om.AddNamedSlot("GLOBALT0");
+ om.AddNamedSlot("TWRI3OFFSET");
+
+ // Default values
+ Float_t type=-1;
+ om.SetSignal(type,"TYPE");
+ Float_t costh=0;
+ om.SetSignal(costh,"ORIENT");
+ Float_t thresh=0;
+ om.SetSignal(thresh,"THRESH");
+ Float_t sensit=1;
+ om.SetSignal(sensit,"SENSIT");
+ Float_t readout=0;
+ om.SetSignal(readout,"READOUT");
+ Float_t binsize=0;
+ om.SetSignal(binsize,"BINSIZE");
+ Float_t stopdelay=0;
+ om.SetSignal(stopdelay,"EXTSTOP");
+ Float_t globalt0=0;
+ om.SetSignal(globalt0,"GLOBALT0");
+ Float_t twri3offset=0;
+ om.SetSignal(twri3offset,"TWRI3OFFSET");
+
+ // Variables needed
+ TSQLStatement* st;
+ IceAOM* omx=0;
+ Int_t omid;
+ Double_t pos[3]={0,0,0};
+ Float_t peArea, twrT0;
+ Int_t jtrans,jrec;
+ Float_t c, b, dlemin, dlemax;
+ TF1* fcal=0;
+ TF1* fdecal=0;
+ AliTimestamp validitystart, validityend;
+ Int_t revision[682];
+
+ // Get global TWR time offsets
+ st=server->Statement("SELECT TWRGlobalT0, TWRI3TimeOffset FROM AmandaTWRGlobalConstants;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Global TWR time offsets could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  st->NextResultRow();
+  globalt0=st->GetDouble(0);
+  twri3offset=st->GetDouble(1);
+ }
+
+ // Get positions of Amanda OMs in IceCube coordinates
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, OmId, X, Y, Z, AmandaOm.TypeId, Orientation FROM GeometryOm INNER JOIN AmandaOm INNER JOIN CalibrationDetail WHERE GeometryOm.StringId=AmandaOm.StringId AND GeometryOm.TubeId=AmandaOm.TubeId AND GeometryOm.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=2;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Positions could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Enter calibration values
+    pos[0]=st->GetDouble(4);
+    pos[1]=st->GetDouble(5);
+    pos[2]=st->GetDouble(6);
+    omx->SetPosition(pos,"car");
+    type=(Float_t)st->GetInt(7);
+    omx->SetSignal(type,"TYPE");
+    costh=(Float_t)st->GetInt(8);
+    omx->SetSignal(costh,"ORIENT");
+    if(globalt0) omx->SetSignal(globalt0,"GLOBALT0");
+    if(twri3offset) omx->SetSignal(twri3offset,"TWRI3OFFSET");
+   }
+  }
+ }
+
+ // Get sensitivity/threshold of Amanda OMs
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, om_id, sc_sensit, sc_thresh FROM AmandaStatusOm INNER JOIN CalibrationDetail WHERE AmandaStatusOm.ca_id=CalibrationDetail.CaId AND CalibrationDetail.TypeId=804;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Sensitivity/threshold could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Enter calibration values
+    thresh=(Float_t)st->GetDouble(4);
+    sensit=(Float_t)st->GetDouble(5);
+    omx->SetSignal(thresh,"THRESH");
+    omx->SetSignal(sensit,"SENSIT");
+   }
+  }
+ }
+
+ // Get readout types of Amanda OMs
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, OmId, CableType FROM AmandaTWRCableType INNER JOIN AmandaOm INNER JOIN CalibrationDetail WHERE AmandaTWRCableType.StringId=AmandaOm.StringId AND AmandaTWRCableType.TubeId=AmandaOm.TubeId AND AmandaTWRCableType.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=853;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Readout types could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Enter calibration values
+    if(st->GetUInt(4) == 0) readout=1;        // Electrical
+    else if(st->GetUInt(4) == 10) readout=2;  // Optical
+    else readout=0;                           // Unknown
+    omx->SetSignal(readout,"READOUT");
+   }
+  }
+ }
+
+ // Get bin sizes and stop delays types of TWRs
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, OmId, BinSize, StopDelay FROM AmandaTWRStandard INNER JOIN AmandaOm INNER JOIN CalibrationDetail WHERE AmandaTWRStandard.StringId=AmandaOm.StringId AND AmandaTWRStandard.TubeId=AmandaOm.TubeId AND AmandaTWRStandard.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=852;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Bin size and stop delays could not be read from DB" << endl;
  }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Enter calibration values
+    binsize=(Float_t)st->GetInt(4);
+    stopdelay=(Float_t)st->GetInt(5);
+    omx->SetSignal(binsize,"BINSIZE");
+    omx->SetSignal(stopdelay,"EXTSTOP");
+   }
+  }
+ }
+
+ // Get JEBTDaq amplitude and time calibration constants
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, OmId, peArea, twrT0 FROM AmandaTWRCalibration INNER JOIN AmandaOm INNER JOIN CalibrationDetail WHERE AmandaTWRCalibration.StringId=AmandaOm.StringId AND AmandaTWRCalibration.TubeId=AmandaOm.TubeId AND AmandaTWRCalibration.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=854;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Bin size and stop delays could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Set calibration functions
+    omx->SetCalFunction(&fadccal,1);
+    omx->SetDecalFunction(&fadcdecal,1);
+    omx->SetCalFunction(&ftdccal,2);
+    omx->SetDecalFunction(&ftdcdecal,2);
+    omx->SetCalFunction(&ftotcal,3);
+    omx->SetDecalFunction(&ftotdecal,3);
+    // Get calibration values
+    peArea=(Float_t)st->GetDouble(4);
+    twrT0=(Float_t)st->GetDouble(5);
+    // Flag amplitude slots of bad OMs as dead and don't provide amplitude (de)calib functions
+    if (peArea<=0 || omx->GetSignal("BINSIZE")<=0)
+    {
+     omx->SetDead(1);
+     omx->SetCalFunction(0,1);
+     omx->SetDecalFunction(0,1);
+    }
+    // Set amplitude calibration function parameters
+    fcal=omx->GetCalFunction(1);
+    fdecal=omx->GetDecalFunction(1);
+    if (fcal)
+    {
+     // peArea as read from the DB is the factor that converts the integrated
+     // area under the peak to the number of pe, that is, the sum over all bins
+     // of ADC*binsize. In IcePack, we simply add up the bin contents of the
+     // peak, without multiplying by binsize. Hence, the calibration factor is 
+     // peArea/binsize, rather than peArea.
+     fcal->SetParameter(0,peArea/omx->GetSignal("BINSIZE"));
+    }
+    if (fdecal)
+    {
+     fdecal->SetParameter(0,peArea/omx->GetSignal("BINSIZE"));
+     if (!peArea) fdecal->SetParameter(0,1);
+    }
+    // Flag LE slots of bad OMs as dead and don't provide time (de)calib functions
+    if (twrT0<=0)
+    {
+     omx->SetDead(2);
+     omx->SetCalFunction(0,2);
+     omx->SetDecalFunction(0,2);
+    }
+    // Set time calibration function parameters
+    fcal=omx->GetCalFunction(2);
+    fdecal=omx->GetDecalFunction(2);
+    if (fcal)
+    {
+     fcal->SetParameter(0,twrT0);
+    }
+    if (fdecal)
+    {
+     fdecal->SetParameter(0,twrT0);
+    }
+   }
+  }
+ }
+
+ // Get Xtalk probability constants
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, om_talker_id, om_receiver_id, threshold, width, timelow, timehigh FROM AmandaXtalkOm INNER JOIN CalibrationDetail WHERE AmandaXtalkOm.ca_id=CalibrationDetail.CaId AND CalibrationDetail.TypeId=807;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Xtalk probability constants could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   jtrans=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[jtrans]=st->GetInt(2);
+    jrec=st->GetInt(4);
+    // Get transmitter OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(jtrans,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(jtrans);
+     fJEBTDaqdb->EnterObject(jtrans,1,omx);
+    }
+    // Get calibration values
+    c=(Float_t)st->GetDouble(5);
+    b=(Float_t)st->GetDouble(6);
+    dlemin=(Float_t)st->GetDouble(7);
+    dlemax=(Float_t)st->GetDouble(8);
+    // Make Xtalk probability function and set parameters
+    TF1* fx=new TF1(fxtalkp);
+    fx->SetParameter(0,c);
+    if (b) fx->SetParameter(1,b);
+    else fx->SetParameter(1,1);
+    fx->SetParameter(2,dlemin);
+    fx->SetParameter(3,dlemax);
+    fJEBTDaqdb->EnterObject(jtrans,jrec+1,fx);
+   }
+  }
+ }
+
+ // Flag OMs in bad OM list as dead
+ for(omid=0; omid<=681; omid++) revision[omid]=0;
+ st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, om_id FROM AmandaBadOm INNER JOIN CalibrationDetail WHERE AmandaBadOm.ca_id=CalibrationDetail.CaId AND CalibrationDetail.TypeId=803;");
+ if (!st)
+ {
+  cout << " *IceDB2Root GetJEBTDaqData* Bad OM list could not be read from DB" << endl;
+ }
+ else {
+  st->Process();
+  st->StoreResult();
+  while(st->NextResultRow())
+  {
+   // Only get calibrations with correct validity range, and update with latest revision in case of several valid calibrations
+   validitystart.SetUT(st->GetYear(0),st->GetMonth(0),st->GetDay(0),st->GetHour(0),st->GetMinute(0),st->GetSecond(0));
+   validityend.SetUT(st->GetYear(1),st->GetMonth(1),st->GetDay(1),st->GetHour(1),st->GetMinute(1),st->GetSecond(1));
+   omid=st->GetInt(3);
+   if(validitystart.GetDifference(fTime,"d",1)>0 && validityend.GetDifference(fTime,"d",1)<0 && st->GetInt(2) > revision[omid])
+   {
+    revision[omid]=st->GetInt(2);
+    // Get OM, create a new one if necessary
+    omx=(IceAOM*)fJEBTDaqdb->GetObject(omid,1);
+    if (!omx)
+    {
+     omx=new IceAOM(om);
+     omx->SetUniqueID(omid);
+     fJEBTDaqdb->EnterObject(omid,1,omx);
+    }
+    // Flag OMs as dead
+    omx->SetDead(1);
+    omx->SetCalFunction(0,1);
+    omx->SetDecalFunction(0,1);
+    omx->SetDead(2);
+    omx->SetCalFunction(0,2);
+    omx->SetDecalFunction(0,2);
+    omx->SetDead(3);
+    omx->SetCalFunction(0,3);
+    omx->SetDecalFunction(0,3);
+   }
+  }
+ }
 }
 ///////////////////////////////////////////////////////////////////////////
 void IceDB2Root::GetJEBADaqData()
@@ -1273,9 +1686,10 @@ void IceDB2Root::GetJEBADaqData()
  IceDOM* omx=0;
  Int_t omid;
  Double_t pos[3]={0,0,0};
- Float_t peArea;
- TF1* fcal=0;
- TF1* fdecal=0;
+////TODO: declare these variables once amplitude calibration becomes available
+// Float_t peArea;
+// TF1* fcal=0;
+// TF1* fdecal=0;
  AliTimestamp validitystart, validityend;
  const Int_t maxomid=8064;
  Int_t revision[maxomid+1];
@@ -1320,6 +1734,7 @@ void IceDB2Root::GetJEBADaqData()
 
  // Get JEBADaq amplitude calibration constants
  //// TODO: Insert correct table and field names and use correct calibration type
+ /*
  for(omid=0; omid<=maxomid; omid++) revision[omid]=0;
  st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, StringId, TubeId, XXXpeArea FROM XXXampl INNER JOIN CalibrationDetail WHERE StringId>0 AND XXXampl.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=XXX;");
  if (!st)
@@ -1374,9 +1789,11 @@ void IceDB2Root::GetJEBADaqData()
    }
   }
  }
+ */
 
  /*
  // Flag OMs in bad OM list as dead
+ //// TODO: Insert correct table and field names and use correct calibration type
  for(omid=0; omid<=maxomid; omid++) revision[omid]=0;
  st=server->Statement("SELECT ValidityStartDate, ValidityEndDate, RevisionId, StringId, TubeId FROM XXXBadOm INNER JOIN CalibrationDetail WHERE StringId>0 AND XXXBadOm.CaId=CalibrationDetail.CaId AND CalibrationDetail.TypeId=XXX;");
  if (!st)
index 545df56..fea3630 100644 (file)
@@ -44,6 +44,9 @@
 //
 // IceRoot q("IceRoot","Simple Root data to IcePack data structure conversion");
 //
+// // Specify the relevant calibration file
+// q.SetCalibFile("calib2006.root");
+//
 // // Limit the number of entries for testing
 // q.SetMaxEvents(10);
 //
@@ -96,7 +99,7 @@ IceRoot::IceRoot(const char* name,const char* title) : AliJob(name,title)
  fInfiles=0;
  fOutfile=0;
  fCalfile=0;
- fTWRDaq=0;
+ fJEBTDaq=0;
 }
 ///////////////////////////////////////////////////////////////////////////
 IceRoot::~IceRoot()
@@ -198,14 +201,15 @@ TFile* IceRoot::GetOutputFile()
 void IceRoot::SetCalibFile(TString name)
 {
 // Set the calibration ROOT file as created with IceCal2Root.
-// Note : this will overrule a previously attached database. 
+// Note: this will overrule a previously attached database. 
+// In case no calibration file is specified, TWR waveforms cannot be processed.
  if (fCalfile) delete fCalfile;
  fCalfile=new TFile(name.Data());
 
  if(fCalfile){
-  fTWRDaq=(AliObjMatrix*)fCalfile->Get("TWRDaq-OMDBASE");
+  fJEBTDaq=(AliObjMatrix*)fCalfile->Get("JEBTDaq-OMDBASE");
  }
- if(!fTWRDaq){
+ if(!fJEBTDaq){
   cout << "*IceRoot* Warning: no calibration available for TWR. TWR waveforms cannot be processed." << endl;
  }
 
@@ -214,9 +218,10 @@ void IceRoot::SetCalibFile(TString name)
 void IceRoot::SetOMdbase(AliObjMatrix* omdb)
 {
 // Set the calibration database as created with IceCal2Root.
-// Note : this will overrule a previously attached database. 
- fTWRDaq=omdb;
- if(!fTWRDaq){
+// Note: this will overrule a previously attached database. 
+// In case no calibration database is specified, TWR waveforms cannot be processed.
+ fJEBTDaq=omdb;
+ if(!fJEBTDaq){
   cout << "*IceRoot* Warning: no calibration available for TWR. TWR waveforms cannot be processed." << endl;
  }
 
@@ -254,6 +259,11 @@ void IceRoot::Exec(Option_t* opt)
   return;
  }
 
+ // Warning in case no calibration DB is specified
+ if(!fJEBTDaq){
+  cout << "*IceRoot* Warning: no calibration available for TWR. TWR waveforms cannot be processed." << endl;
+ }
+
  // Create output tree if necessary
  TTree* otree=0;
  if (fOutfile)
@@ -313,7 +323,6 @@ void IceRoot::Exec(Option_t* opt)
  Char_t    trigsourceID[100][100];
  Char_t    trigtypeID[100][100];
  Char_t    trigsubtypeID[100][100];
- Double_t  dmaddtriggertime=0;
  Int_t     eventtimemjd=0;
  Int_t     eventtimemjds=0;
  Int_t     eventtimemjdns=0;
@@ -322,6 +331,7 @@ void IceRoot::Exec(Option_t* opt)
  Int_t     String=0;
  Int_t     OM=0;
  Short_t   waveformtype=0; // 1 = TWR, 2 = non-merged ATWD (not supported), 3 = InIce merged ATWD, 4 = InIce FADC, 5 = IceTop merged ATWD, 6 = IceTop FADC
+ Short_t   twreventnr=0;
  UInt_t    baseline=0;
  Int_t     numberbinstwr=0;
  Int_t     startbin=0;
@@ -338,7 +348,7 @@ void IceRoot::Exec(Option_t* opt)
  Double_t* trackzenith=0;
  Double_t* trackazimuth=0;
  Double_t* trackenergy=0;
- Char_t    tracktype[10][100];
+ Char_t    tracktype[100][100];
 
  // Some other variables
  Int_t nevt=0;
@@ -346,7 +356,8 @@ void IceRoot::Exec(Option_t* opt)
  Int_t omid=0;
  Double_t starttime=0;
  Int_t extstop=0;
- Int_t twrbuffer=1024; // Number of bins in TWR
+ Float_t twrtime=10240; // Number of bins in TWR
+ Int_t twrbuffer=0;
 
  TString hname;
  TH1F histo;
@@ -365,6 +376,24 @@ void IceRoot::Exec(Option_t* opt)
 
  TFile* input=0;
 
+ Double_t* twreventtimes=0;
+ Int_t nrtwrevents=0;
+ Int_t* twreventorder=0;
+
+ // Get global TWR time offsets from DB
+ Float_t globalt0=0;
+ Float_t twri3offset=0;
+ if(fJEBTDaq){
+  for(Int_t row=1; row<=fJEBTDaq->GetMaxRow(); row++){
+   calom=(IceGOM*)fJEBTDaq->GetObject(row,1);
+   if(calom){
+    globalt0=calom->GetSignal("GLOBALT0");
+    twri3offset=calom->GetSignal("TWRI3OFFSET");
+    break;
+   }
+  }
+ }
+
  for (Int_t ifile=0; ifile<ninfiles; ifile++)
  {
   TObjString* sx=(TObjString*)fInfiles->At(ifile);
@@ -387,7 +416,6 @@ void IceRoot::Exec(Option_t* opt)
 
   fTree->SetBranchAddress("pretrig",&pretrig);
   fTree->SetBranchAddress("trignr",&trignr);
-  fTree->SetBranchAddress("dmaddtriggertime",&dmaddtriggertime);
   fTree->SetBranchAddress("eventtimemjd",&eventtimemjd);
   fTree->SetBranchAddress("eventtimemjds",&eventtimemjds);
   fTree->SetBranchAddress("eventtimemjdns",&eventtimemjdns);
@@ -396,6 +424,7 @@ void IceRoot::Exec(Option_t* opt)
   fTree->SetBranchAddress("String",&String);
   fTree->SetBranchAddress("OM",&OM);
   fTree->SetBranchAddress("waveformtype",&waveformtype);
+  fTree->SetBranchAddress("twreventnr",&twreventnr);
   fTree->SetBranchAddress("baseline",&baseline);
   fTree->SetBranchAddress("numberbinstwr",&numberbinstwr);
   fTree->SetBranchAddress("startbin",&startbin);
@@ -444,7 +473,6 @@ void IceRoot::Exec(Option_t* opt)
   for(Int_t ientry=0; ientry<fTree->GetEntries(); ientry++)
   {
    fTree->GetEntry(ientry);
-
    // If new event
    if(eventid!=lastevent)
    {
@@ -483,32 +511,6 @@ void IceRoot::Exec(Option_t* opt)
     }
     evt->AddDevice(daq);
 
-    // Store trigger information
-    trig.Reset(1);
-    for(Int_t itr=0; itr<trignr; itr++){
-     s.Reset(1);
-     sprintf(trigname,"%s/%s",trigsourceID[itr],trigtypeID[itr]);
-     s.SetName(trigname);
-     s.SetSlotName("trig_pulse_le",1);
-     s.SetSignal(trigtime[itr],1);
-     s.SetSlotName("trig_pulse_tot",2);
-     s.SetSignal(triglength[itr],2);
-     trig.AddHit(s);
-    }
-    // Add main trigger unless it is already present
-    // TODO: select most appropriate trigger as artificial "main"
-    // For now: select first trigger in event
-    if(!trig.GetHit("main")){
-     s.Reset(1);
-     s.SetName("main");
-     s.SetSlotName("trig_pulse_le",1);
-     s.SetSignal(trigtime[0],1);
-     s.SetSlotName("trig_pulse_tot",2);
-     s.SetSignal(triglength[0],2);
-     trig.AddHit(s);
-    }
-    evt->AddDevice(trig);
-
     // Loop over all the tracks and add them to the current event
     Int_t nrecotracks=0;
     Int_t nmctracks=0;
@@ -557,6 +559,61 @@ void IceRoot::Exec(Option_t* opt)
      }
     }
 
+    // Store trigger information
+    if (twreventtimes) delete[] twreventtimes;
+    twreventtimes=new Double_t[trignr];
+    if (twreventorder) delete[] twreventorder;
+    twreventorder=new Int_t[trignr];
+    nrtwrevents=0;
+    trig.Reset(1);
+    // Loop over triggers
+    for(Int_t itr=0; itr<trignr; itr++){
+     // For TWR events:
+     if(TString(trigsourceID[itr])=="AMANDA_TWR_DAQ"){
+      // Add global time offset if there are no MC tracks (i.e. if the data are real data)
+      if(!nmctracks) trigtime[itr]-=globalt0+twri3offset;
+      // Check if this trigger belongs to a new event
+      Int_t newevent=1;
+      for(Int_t itwrevent=0; itwrevent<nrtwrevents; itwrevent++){
+       if(fabs(trigtime[itr]-twreventtimes[itwrevent])<1500){
+        newevent=0;
+        break;
+       }
+      }
+      // Add new TWR event time
+      if(newevent){
+       twreventtimes[nrtwrevents]=trigtime[itr];
+       nrtwrevents++;
+      }
+     }
+
+     // Add this trigger to trigger device
+     s.Reset(1);
+     sprintf(trigname,"%s/%s",trigsourceID[itr],trigtypeID[itr]);
+     s.SetName(trigname);
+     s.SetSlotName("trig_pulse_le",1);
+     s.SetSignal(trigtime[itr],1);
+     s.SetSlotName("trig_pulse_tot",2);
+     s.SetSignal(triglength[itr],2);
+     trig.AddHit(s);
+    } // End of loop over triggers
+
+    TMath::Sort(nrtwrevents,twreventtimes,twreventorder,0);
+
+    // Add main trigger unless it is already present
+    // TODO: select most appropriate trigger as artificial "main"
+    // For now: select first trigger in event
+    if(!trig.GetHit("main")){
+     s.Reset(1);
+     s.SetName("main");
+     s.SetSlotName("trig_pulse_le",1);
+     s.SetSignal(trigtime[0],1);
+     s.SetSlotName("trig_pulse_tot",2);
+     s.SetSignal(triglength[0],2);
+     trig.AddHit(s);
+    }
+    evt->AddDevice(trig);
+
     // Remember event nr
     lastevent=eventid;
    }
@@ -616,10 +673,9 @@ void IceRoot::Exec(Option_t* opt)
    }
 
    // Fill the waveform histogram with this fragment
-
    // TWR waveform
-   if(waveformtype==1){
-    if(numberbinstwr>0){
+   if(waveformtype==1){ 
+    if(numberbinstwr>0 && twreventnr<nrtwrevents){
      histo.Reset();
      // Store baseline info
      hname="BASELINE-WF";
@@ -635,14 +691,19 @@ void IceRoot::Exec(Option_t* opt)
      histo.SetName(hname.Data());
      // Add waveform
      calom=0;
-     if(fTWRDaq) calom=(IceGOM*)fTWRDaq->GetObject(omid,1);
+     if(fJEBTDaq) calom=(IceGOM*)fJEBTDaq->GetObject(omid,1);
      if(!calom){
       cout << "IceRoot: No calibration info for OM " << omid << ", skipping this waveform" << endl;
       continue;
      }
      binwidth=calom->GetSignal("BINSIZE");
+     if(binwidth<=0){
+      cout << "IceRoot: Zero bin width for OM " << omid << ", skipping this waveform" << endl;
+      continue;
+     }
+     twrbuffer=(Int_t)(twrtime/binwidth);
      extstop=(Int_t)calom->GetSignal("EXTSTOP");
-     starttime=dmaddtriggertime+binwidth*(startbin-twrbuffer+extstop);
+     starttime=twreventtimes[twreventorder[twreventnr]]+binwidth*(startbin-twrbuffer+extstop);
      histo.SetBins(numberbinstwr,starttime,starttime+numberbinstwr*binwidth);
      for (Int_t jbin=1; jbin<=numberbinstwr; jbin++)
      {
@@ -650,7 +711,7 @@ void IceRoot::Exec(Option_t* opt)
      }
      om->SetWaveform(&histo,om->GetNwaveforms()+1);
     } else {
-     cout << "IceRoot::Exec: waveformtype=1, but numberbinstwr=0." << endl;
+     cout << "IceRoot::Exec: waveformtype=1, but numberbinstwr=0 or nrtwrevents=0." << endl;
     }
    }
 
@@ -737,16 +798,26 @@ void IceRoot::Exec(Option_t* opt)
   input->Close();
 
   // Clean up
-  delete[] trigtime;
-  delete[] triglength;
-  delete[] twrwaveform;
-  delete[] waveform;
-  delete[] trackx;
-  delete[] tracky;
-  delete[] trackz;
-  delete[] trackzenith;
-  delete[] trackazimuth;
-  delete[] trackenergy;
+  if (trigtime) delete[] trigtime;
+  if (triglength) delete[] triglength;
+  if (twrwaveform) delete[] twrwaveform;
+  if (waveform) delete[] waveform;
+  if (trackx) delete[] trackx;
+  if (tracky) delete[] tracky;
+  if (trackz) delete[] trackz;
+  if (trackzenith) delete[] trackzenith;
+  if (trackazimuth) delete[] trackazimuth;
+  if (trackenergy) delete[] trackenergy;
+  if (twreventtimes)
+  {
+   delete[] twreventtimes;
+   twreventtimes=0;
+  }
+  if (twreventorder)
+  {
+   delete[] twreventorder;
+   twreventorder=0;
+  }
 
   // Stop looping over input files if max. nr. of events is reached
   if (fMaxevt>-1 && nevt>=fMaxevt)
index 0aee96c..b57c793 100644 (file)
@@ -9,6 +9,7 @@
 #include "TFile.h"
 #include "TTree.h"
 #include "TLeaf.h"
+#include "TMath.h"
 #include "TString.h"
 #include "TObjString.h"
 #include "TObjArray.h"
@@ -42,16 +43,16 @@ class IceRoot : public AliJob
   virtual void Exec(Option_t* opt);      // Perform the format conversion
 
  protected :
-  Int_t fSplit;          // The split level of the produced ROOT data file
-  Int_t fBsize;          // The buffersize of the produced ROOT data file
-  Int_t fMaxevt;         // The maximum number of events to be processed
-  Int_t fPrintfreq;      // The event info printing frequency
-  TObjArray* fInfiles;   // Names of all the simple Root data input files
-  TFile* fOutfile;       // The ROOT output file
-  TFile* fCalfile;       // The (optional) calibration input file in ROOT format
-  AliObjMatrix* fTWRDaq; // The (optional) TWR calibration database
-  TTree* fTree;          // Tree with simple Root data
-
- ClassDef(IceRoot,3) // Job for conversion of simple Root data into IceEvent data structures.
+  Int_t fSplit;           // The split level of the produced ROOT data file
+  Int_t fBsize;           // The buffersize of the produced ROOT data file
+  Int_t fMaxevt;          // The maximum number of events to be processed
+  Int_t fPrintfreq;       // The event info printing frequency
+  TObjArray* fInfiles;    // Names of all the simple Root data input files
+  TFile* fOutfile;        // The ROOT output file
+  TFile* fCalfile;        // The (optional) calibration input file in ROOT format
+  AliObjMatrix* fJEBTDaq; // The (optional) JEB TWR calibration database
+  TTree* fTree;           // Tree with simple Root data
+
+ ClassDef(IceRoot,4) // Job for conversion of simple Root data into IceEvent data structures.
 };
 #endif
index 77066f1..426506f 100644 (file)
 14-nov-2007 NvE Bug fix in IceDB2Root in the creation of the JEBTDaq database.
                 The new Clone() memberfunction of AliObjMatrix is now used and a memory
                 leak has been removed. Also GetOMdbase() has been updated for JEBTDaq.
+19-nov-2007 GdV IceDB2Root extended to provide also the global time offsets for Amanda
+                modules w.r.t to the InIce triggers.
+21-nov-2007 GdV Global time offset corrections for real data performed in IceRoot.