07-jun-2007 NvE Maximum OM id changed from 681 to 680 in IceRawTWR.cxx to ignore...
authornick <nick@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Jun 2007 14:35:10 +0000 (14:35 +0000)
committernick <nick@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 21 Jun 2007 14:35:10 +0000 (14:35 +0000)
                of OM 681 which is always regarded is being bad.
                Also new OM slotname "READOUT" introduced in IceCal2Root, IceF2k and IceRawTWR
                to identify electrical, optical and digital readout based on the Dbase info
                and/or actual settings in the various data files (headers).
07-jun-2007 GdV OM readout type also updated from the data contents in IceRoot.cxx.
08-jun-2007 GdV Support introduced in IceRoot.cxx to set the waveform binsize based on the
                info from the data of the I3 file.
08-jun-2007 NvE First attempt for TWR ADC calibration in IceCal2Root.cxx.
09-jun-2007 GdV OM 681 now also ignored in IceRoot.cxx.
21-jun-2007 GdV Trigger device and "main" trigger introduced IceRoot.cxx to provide
                the actual trigger time(s).
21-jun-2007 NvE External stop and (first) trigger time taken into account for the
                TWR waveform timebins in IceRawTWR. This will provide a better
                synchronisation of the various waveforms and consequently of the
                extracted LE values.

RALICE/icepack/iceconvert/IceCal2Root.cxx
RALICE/icepack/iceconvert/IceRawTWR.cxx
RALICE/icepack/iceconvert/IceRawTWR.h
RALICE/icepack/iceconvert/IceRoot.cxx
RALICE/icepack/iceconvert/history.txt

index 9750963..d5d5252 100644 (file)
@@ -606,12 +606,10 @@ void IceCal2Root::GetTWRDaqData()
  }
 
  // Prescription of the various (de)calibration functions
- TF1 fadccal("fadccal","(x-[0])*[1]");
- TF1 fadcdecal("fadcdecal","(x/[1])+[0]");
- fadccal.SetParName(0,"ADC-PED");
- fadccal.SetParName(1,"ADC-FACT");
- fadcdecal.SetParName(0,"ADC-PED");
- fadcdecal.SetParName(1,"ADC-FACT");
+ 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]");
@@ -628,10 +626,11 @@ void IceCal2Root::GetTWRDaqData()
 
  Int_t jmod;
  Float_t t0;
+ Float_t ncpe;
  IceAOM* omx=0;
  TF1* fcal=0;
  TF1* fdecal=0;
- while (fInput >> jmod >> t0)
+ while (fInput >> jmod >> t0 >> ncpe)
  {
   // Copy the Geom data from the MuDaq OM database
   IceAOM* omg=(IceAOM*)fMuDaqdb->GetObject(jmod,1);
@@ -652,7 +651,13 @@ void IceCal2Root::GetTWRDaqData()
   omx->SetCalFunction(&ftotcal,"TOT");
   omx->SetDecalFunction(&ftotdecal,"TOT");
 
-  // Flag time slots of bad OMs as dead and don't provide time (de)calib functions
+  // Flag slots of bad OMs as dead and don't provide time (de)calib functions
+  if (ncpe<=0)
+  {
+   omx->SetDead("ADC");
+   omx->SetCalFunction(0,"ADC");
+   omx->SetDecalFunction(0,"ADC");
+  }
   if (t0<-999)
   {
    omx->SetDead("LE");
@@ -668,13 +673,11 @@ void IceCal2Root::GetTWRDaqData()
   fdecal=omx->GetDecalFunction("ADC");
   if (fcal)
   {
-   fcal->SetParameter(0,0);
-   fcal->SetParameter(1,1);
+   fcal->SetParameter(0,ncpe);
   }
   if (fdecal)
   {
-   fdecal->SetParameter(0,0);
-   fdecal->SetParameter(1,1);
+   fdecal->SetParameter(0,ncpe);
   }
 
   fcal=omx->GetCalFunction("LE");
index bad9c83..741a1a8 100644 (file)
@@ -260,9 +260,11 @@ void IceRawTWR::Exec(Option_t* opt)
  params.SetSlotName("Nchannels",1);
  params.SetSlotName("Ntriggers",2);
  params.SetSlotName("BaselineOffset",3);
+ params.SetSlotName("NanosecsPerTWRbin",4);
  params.SetSignal(float(N_OF_CHANNELS),1);
  params.SetSignal(float(N_OF_TRIGGERS),2);
  params.SetSignal(float(BASELINE_MEAN_MAGIC),3);
+ params.SetSignal(float(NSECS_PER_TWR_BIN),4);
 
  // Set DAQ device info
  AliDevice daq;
@@ -320,17 +322,19 @@ void IceRawTWR::Exec(Option_t* opt)
   // Correct the mapping
   update_system(fHeader,runnum);
 
-  // Retrieve the actual readout system and threshold of each OM for these data
+  // Retrieve the actual readout system, threshold and external stop of each OM for these data
   fReadout.Set(681);
   fThreshold.Set(681);
+  fExtstop.Set(681);
   Int_t ncrates=fHeader->n_crates;
   Int_t ntwrs=0;
-  Int_t omid,readout,thresh;
+  Int_t omid,readout,thresh,extstop;
   for (Int_t icr=0; icr<ncrates; icr++)
   {
    ntwrs=fHeader->crate[icr]->n_twr;
    for (Int_t i_twr=0; i_twr<ntwrs; i_twr++)
    {
+    extstop=fHeader->crate[icr]->twr[i_twr]->ext_stop;
     for (Int_t ich=0; ich<CHANNELS_PER_TWR; ich++)
     {
      omid=fHeader->crate[icr]->twr[i_twr]->om_no[ich];
@@ -340,6 +344,7 @@ void IceRawTWR::Exec(Option_t* opt)
      {
       fReadout.AddAt(readout,omid-1);
       fThreshold.AddAt(thresh,omid-1);
+      fExtstop.AddAt(extstop,omid-1);
      }
     }
    }
@@ -424,6 +429,15 @@ void IceRawTWR::PutWaveforms(Int_t year)
  IceEvent* evt=(IceEvent*)GetMainObject();
  if (!evt) return;
 
+ // Get trigger time for TWR time reference
+ Float_t trigtime=0;
+ AliDevice* trig=(AliDevice*)evt->GetDevice("Trigger");
+ if (trig)
+ {
+  AliSignal* sx=trig->GetHit("main");
+  if (sx) trigtime=sx->GetSignal("trig_pulse_le");
+ }
+
  // Loop over all the waveforms and add the histo(s) to the corresponding OM's
  TH1F histo;
  Int_t nbins=0;
@@ -438,6 +452,7 @@ void IceRawTWR::PutWaveforms(Int_t year)
  Float_t baseline;
  Int_t nfrags;
  Int_t firstbin,lastbin;
+ Int_t extstop;
  for (Int_t i=0; i<N_OF_CHANNELS; i++)
  {
   if (!fEvent.wfm_filled[i]) continue;
@@ -457,11 +472,15 @@ void IceRawTWR::PutWaveforms(Int_t year)
 
   if (!omx) continue;
 
+  extstop=fExtstop.At(omid-1);
+
   // Update readout type and threshold for this OM
   omx->AddNamedSlot("READOUT");
   omx->SetSignal(float(fReadout.At(omid-1)),"READOUT");
   omx->AddNamedSlot("THRESH");
   omx->SetSignal(float(fThreshold.At(omid-1)),"THRESH");
+  omx->AddNamedSlot("EXTSTOP");
+  omx->SetSignal(float(extstop),"EXTSTOP");
 
   clear_waveform_analysis(&fWform);
   error=restore_waveform(fEvent.wfm[i],&fWform,year);
@@ -494,6 +513,10 @@ void IceRawTWR::PutWaveforms(Int_t year)
    xlow=fWform.wfm_x[firstbin];
    xup=fWform.wfm_x[lastbin];
 
+   // Synchronise waveform times with external stop and trigger time
+   xlow=xlow-float(NSECS_PER_TWR_BIN)*(1024-extstop)+trigtime;
+   xup=xup-float(NSECS_PER_TWR_BIN)*(1024-extstop)+trigtime;
+
    histo.SetBins(nbins,xlow,xup);
 
    for (Int_t jbin=1; jbin<=nbins; jbin++)
@@ -538,6 +561,7 @@ void IceRawTWR::PutTrigger(Int_t year)
  if (year !=2005 && year != 2006)
  {
   s.SetName("main");
+  s.SetTitle("First trigger for TWR time reference");
   s.SetUniqueID(0);
   s.SetSlotName("trig_pulse_le",1);
   s.SetSignal(trigtime,1);
@@ -561,7 +585,7 @@ void IceRawTWR::PutTrigger(Int_t year)
   s.SetName(trignames[i]);
   s.SetUniqueID(i);
   trigtime=0;
-  if (fTrigger.trigger_has_pulse[i]) trigtime=fTrigger.trigger_time[i];
+  if (fTrigger.trigger_has_pulse[i]) trigtime=float(fTrigger.trigger_time[i]*NSECS_PER_TWR_BIN);
   s.SetSlotName("trig_pulse_le",1);
   s.SetSignal(trigtime,1);
   trig.AddHit(s);
@@ -569,15 +593,16 @@ void IceRawTWR::PutTrigger(Int_t year)
   if (i!=4 && i!=5 && i!=9) imain=1;
  }
 
- // Set the artificial "main" trigger
+ // Set the artificial "main" trigger to indicate the first trigger signal
  if (imain)
  {
   s.Reset(1);
   s.SetName("main");
+  s.SetTitle("First trigger for TWR time reference");
   s.SetUniqueID(N_OF_TRIGGERS);
   s.SetSlotName("trig_pulse_le",1);
   trigtime=0;
-  if (fTrigger.first_trigger>=0) trigtime=fTrigger.first_trigger_time;
+  if (fTrigger.first_trigger>=0) trigtime=float(fTrigger.first_trigger_time*NSECS_PER_TWR_BIN);
   s.SetSignal(trigtime,1);
   trig.AddHit(s);
  }
index 425a24f..2a9ca05 100644 (file)
@@ -45,6 +45,7 @@ class IceRawTWR : public AliJob
   TFile* fOutfile;     // The ROOT output file
   TArrayI fReadout;    // The OM readout type (0=unknown 1=electrical 2=optical)
   TArrayI fThreshold;  // The OM thresholds in ADC
+  TArrayI fExtstop;    // The TWR external stop value in bin counts for each OM
   void PutTrigger(Int_t year);   // Put the trigger info from the raw data event into the IcePack structure
   void PutWaveforms(Int_t year); // Put the waveforms from the raw data event into the IcePack structure
 
@@ -65,6 +66,6 @@ class IceRawTWR : public AliJob
   Int_t clear_waveform_analysis(waveform_analyse_t* wfm_om);
   Int_t restore_waveform(waveform_t f_wfm,waveform_analyse_t* wfm_om,Int_t year);
 
- ClassDef(IceRawTWR,2) // Job for conversion of TWR raw data into IceEvent data structures.
+ ClassDef(IceRawTWR,3) // Job for conversion of TWR raw data into IceEvent data structures.
 };
 #endif
index 1d98c68..5780627 100644 (file)
@@ -228,8 +228,8 @@ void IceRoot::Exec(Option_t* opt)
   AddObject(otree);
  }
 
+ // Some output for the user's convenience
  TString inputfile;
-
  cout << " ***" << endl;
  cout << " *** Start processing of job " << GetName() << " ***" << endl;
  cout << " ***" << endl;
@@ -256,6 +256,11 @@ void IceRoot::Exec(Option_t* opt)
  daq.SetSlotName("TWR",1);
  daq.SetSignal(1,1);
 
+ // Trigger device
+ AliDevice trig;
+ trig.SetNameTitle("Trigger","Amanda/IceCube event triggers");
+ AliSignal s;
+
  // Some variables
  Double_t triggertime=0;
  Int_t    eventtimemjd=0;
@@ -266,6 +271,7 @@ void IceRoot::Exec(Option_t* opt)
  Int_t    String=0;
  Int_t    OM=0;
  Float_t  baseline=0;
+ Double_t binsize=10;
  Short_t  type=0;
  Int_t    numberbins=0;
  Float_t  starttime=0;
@@ -286,7 +292,6 @@ void IceRoot::Exec(Option_t* opt)
 
  Float_t pi=acos(-1.);
 
- Float_t binwidth=10;
  Int_t firstomonstring[20];
  firstomonstring[0]=0;
  firstomonstring[1]=1;
@@ -341,6 +346,7 @@ void IceRoot::Exec(Option_t* opt)
   fTree->SetBranchAddress("numberbins",&numberbins);
   fTree->SetBranchAddress("starttime",&starttime);
   fTree->SetBranchAddress("ntracks",&ntracks);
+  if(fTree->GetBranch("binsize")) fTree->SetBranchAddress("binsize",&binsize);
 
   Int_t nmaxbins=(Int_t)fTree->GetLeaf("numberbins")->GetMaximum();
   Float_t* wvform=new Float_t[nmaxbins+1];
@@ -395,6 +401,18 @@ void IceRoot::Exec(Option_t* opt)
     evt->SetMJD(eventtimemjd,eventtimemjds,eventtimemjdns,0);
     evt->AddDevice(daq);
 
+    // Store trigger information
+    trig.Reset(1);
+    s.Reset(1);
+    s.SetName("main");
+    s.SetTitle("First trigger for TWR time reference");
+    s.SetUniqueID(12);
+    s.SetSlotName("trig_pulse_le",1);
+    s.SetSignal(triggertime,1);
+    trig.AddHit(s);
+    //// TODO: store other triggers if available
+    evt->AddDevice(trig);
+
     // Loop over all the tracks and add them to the current event
     for (Int_t itrack=0; itrack<ntracks; itrack++)
     {
@@ -439,8 +457,9 @@ void IceRoot::Exec(Option_t* opt)
     lastevent=eventid;
    }
 
+   // Get OM from event strcture, or create and add it
    omid=firstomonstring[-String]+OM-1;
-   // Get corresponding device from the current event structure  
+   if(omid==681) continue;  // Skip OM 681, which should never give data: avoid all risk of confusion
    omx=(IceAOM*)evt->GetIdDevice(omid);
    if (!omx)
    {
@@ -461,6 +480,7 @@ void IceRoot::Exec(Option_t* opt)
    omx->AddNamedSlot("READOUT");
    if(type==0) omx->SetSignal(1,"READOUT");       // Electrical
    else if(type==1) omx->SetSignal(2,"READOUT");  // Optical
+   else if(type==2) omx->SetSignal(3,"READOUT");  // Digital 
    else omx->SetSignal(0,"READOUT");              // Unknown
 
    // Fill the waveform histogram with this fragment
@@ -471,7 +491,7 @@ void IceRoot::Exec(Option_t* opt)
 
    histo.Reset();
    histo.SetName(hname.Data());
-   histo.SetBins(numberbins,starttime,starttime+numberbins*binwidth);
+   histo.SetBins(numberbins,triggertime+starttime,triggertime+starttime+numberbins*binsize);
 
    for (Int_t jbin=1; jbin<=numberbins; jbin++)
    {
index e05e047..1275835 100644 (file)
                 to identify electrical, optical and digital readout based on the Dbase info
                 and/or actual settings in the various data files (headers). 
 07-jun-2007 GdV OM readout type also updated from the data contents in IceRoot.cxx.
+08-jun-2007 GdV Support introduced in IceRoot.cxx to set the waveform binsize based on the
+                info from the data of the I3 file.
+08-jun-2007 NvE First attempt for TWR ADC calibration in IceCal2Root.cxx. 
+09-jun-2007 GdV OM 681 now also ignored in IceRoot.cxx.
+21-jun-2007 GdV Trigger device and "main" trigger introduced IceRoot.cxx to provide
+                the actual trigger time(s).
+21-jun-2007 NvE External stop and (first) trigger time taken into account for the
+                TWR waveform timebins in IceRawTWR. This will provide a better
+                synchronisation of the various waveforms and consequently of the
+                extracted LE values.