]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - FIT/AliFITDigitizer.cxx
changes for FIT
[u/mrichter/AliRoot.git] / FIT / AliFITDigitizer.cxx
diff --git a/FIT/AliFITDigitizer.cxx b/FIT/AliFITDigitizer.cxx
new file mode 100644 (file)
index 0000000..9addefd
--- /dev/null
@@ -0,0 +1,257 @@
+/**************************************************************************
+ * Copyright(c) 1998-2000, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+
+/******************************************************************
+ *    Produde digits from hits
+ *       digits is TObject and includes
+ *     We are writing array if C & A  TDC
+ *     C & A  ADC (will need for slow simulation)
+ *     TOF first particle C & A
+ *     mean time and time difference (vertex position)
+ *
+ *      Alla.Maevskaya@cern.ch 
+ ****************************************************************/
+
+
+#include <TArrayI.h>
+#include <TFile.h>
+#include <TGraph.h>
+#include <TH1F.h>
+#include <TMath.h>
+#include <TRandom.h>
+#include <TTree.h> 
+
+#include "AliLog.h"
+#include "AliFITDigitizer.h"
+#include "AliFIT.h"
+#include "AliFITHits.h"
+#include "AliFITDigit.h"
+#include "AliDigitizationInput.h"
+#include "AliRun.h"
+#include <AliLoader.h>
+#include <AliRunLoader.h>
+#include <stdlib.h>
+
+ClassImp(AliFITDigitizer)
+
+//___________________________________________
+  AliFITDigitizer::AliFITDigitizer()  :AliDigitizer(),
+                                    fFIT(0),
+                                    fHits(0),
+                                    fDigits(0),
+                                     fNdigits(0)
+{
+// Default ctor - don't use it
+
+}
+
+//___________________________________________
+AliFITDigitizer::AliFITDigitizer(AliDigitizationInput* digInput) 
+  :AliDigitizer(digInput),
+   fFIT(0),
+   fHits(0),
+   fDigits(0),
+   fNdigits(0)
+{
+// ctor which should be used
+}
+
+
+//------------------------------------------------------------------------
+AliFITDigitizer::~AliFITDigitizer()
+{
+// Destructor
+
+  AliDebug(1,"FIT");
+
+ }
+
+//------------------------------------------------------------------------
+Bool_t AliFITDigitizer::Init()
+{
+// Initialization
+  AliDebug(1," Init");
+ return kTRUE;
+
+}
+//---------------------------------------------------------------------
+void AliFITDigitizer::Digitize(Option_t* /*option*/)
+{
+
+  /*
+    Produde digits from hits
+    digits is TObject and includes
+    We are writing array if C & A for each channel CFD, LED, QT0 and QT1
+    C & A  ADC (will need for slow simulation)
+  */
+  
+  
+  
+  //output loader 
+  AliDebug(1,"start...");
+  //input loader
+  //
+  // From hits to digits
+  //
+  
+  AliRunLoader *outRL = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());
+  AliLoader * outFitLoader = outRL->GetLoader("FITLoader");
+  
+  fFIT  = static_cast<AliFIT*>(gAlice->GetDetector("FIT"));
+  if (!fFIT) {
+    AliError("Can not get FIT from gAlice");
+    return;
+  }  
+  fFIT->ResetDigits();
+  
+  DigitizeHits();
+  
+  //load digits    
+  outFitLoader->LoadDigits("UPDATE");
+  TTree *treeD  = outFitLoader->TreeD();
+  if (treeD == 0x0) {
+    outFitLoader->MakeTree("D");
+    treeD = outFitLoader->TreeD();
+  }
+  treeD->Reset();
+  fFIT  = (AliFIT*)outRL ->GetAliRun()->GetDetector("FIT");
+  // Make a branch in the tree 
+  fFIT->MakeBranch("D");
+  treeD->Fill();
+  
+  outFitLoader->WriteDigits("OVERWRITE");
+  fFIT->ResetDigits();
+  outFitLoader->UnloadDigits();
+}
+//____________________________________________________________________________
+void AliFITDigitizer::DigitizeHits()
+{
+
+   Int_t hit, nhits;
+  Float_t time[160], besttime[160];
+  Int_t countE[160];
+  Int_t timeCFD, timeLED, timeQT1, timeQT0;
+
+  Int_t threshold = 0; //photoelectrons
+  Int_t ph2Mip = 200;    
+  Float_t mip2qtc=0.005; 
+  Float_t channelWidth = 24.4 ; 
+  Int_t pmt, mcp, volume, qt; 
+  //eqailized distance from IP
+  Float_t zdetC = 82;
+  Float_t zdetA = 375.;
+  Float_t c = 0.0299792458; // cm/ps
+  Float_t eqdistance = (zdetA - zdetC) /c;
+  
+  AliFITHits  *startHit;
+  TBranch *brHits=0;
+  Int_t nFiles=fDigInput->GetNinputs();
+  for (Int_t inputFile=0; inputFile<nFiles;  inputFile++) {
+    if (inputFile < nFiles-1) {
+      AliWarning(Form("ignoring input stream %d", inputFile));
+      continue;
+     }
+
+  for (Int_t i0=0; i0<160; i0++)
+      {
+       time[i0]=besttime[i0]=999999; countE[i0]=0;
+      }
+  AliRunLoader * inRL = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(inputFile));
+  AliLoader * fitLoader = inRL->GetLoader("FITLoader");
+  if (!inRL->GetAliRun()) inRL->LoadgAlice();
+  Int_t numpmt;
+  //read Hits 
+  fitLoader->LoadHits("READ");//probably it is necessary to load them before
+  fHits = fFIT->Hits ();
+  TTree *th = fitLoader->TreeH();
+  brHits = th->GetBranch("FIT");
+  if (brHits) {
+    fFIT->SetHitsAddressBranch(brHits);
+  }else{
+    AliWarning("Branch FIT hit not found for this event");
+    continue;      
+  } 
+  Int_t ntracks    = (Int_t) th->GetEntries();
+  if (ntracks<=0) return;
+  // Start loop on tracks in the hits containers
+  for (Int_t track=0; track<ntracks;track++) {
+    brHits->GetEntry(track);
+    nhits = fHits->GetEntriesFast();
+    for (hit=0;hit<nhits;hit++) 
+      {
+       startHit   = (AliFITHits*) fHits->UncheckedAt(hit);
+       if (!startHit) {
+         AliError("The unchecked hit doesn't exist");
+         break;
+       }
+       pmt = startHit->Pmt();
+       mcp = startHit->MCP();
+       volume = startHit->Volume();
+       numpmt= volume*80 +4*(mcp) + (pmt-1);
+       besttime[numpmt] = startHit->Time();
+       if(besttime[numpmt]<time[numpmt]) time[numpmt]=besttime[numpmt];
+       countE[numpmt]++;
+      } //hits loop
+  } //track loop
+  
+  for (Int_t ipmt=0; ipmt<160; ipmt++)
+    {
+      if (countE[ipmt]>threshold && time[ipmt]<50000 && time[ipmt]>0 ) {
+       //fill ADC
+       // QTC procedure:
+       // 1MIP ->200phe  ;
+         qt= countE[ipmt] /*/ph2Mip*/;  // 50mv/Mip amp in mV 
+         //  fill TDC
+         if (ipmt<80) time[ipmt] = time[ipmt] + eqdistance;
+         timeCFD = Int_t (gRandom->Gaus(time[ipmt], 50)/channelWidth ); 
+         timeLED =  Int_t (time[ipmt]/channelWidth );
+         timeQT0 = 0;
+         timeQT1 = Int_t (qt ) ;
+         AliDebug(1,Form("Digits:::::  numpmt %i  time CFD %i QTC  %i :: counts %i \n ",  ipmt, timeCFD, timeQT1,  countE[ipmt]) );
+         fFIT-> AddDigit(ipmt,   timeCFD, timeLED, timeQT0,  timeQT1, 0);
+      } //hitted PMTs
+    } //pmt loop
+  fitLoader->UnloadHits();
+  
+  }
+}
+
+//____________________________________________________________________________
+void AliFITDigitizer::AddSDigit(Int_t npmt,  
+                               Int_t timeCFD, Int_t timeLED, Int_t timeQT0, 
+                               Int_t timeQT1) 
+ { 
+// Adds Digit 
+  TClonesArray &ldigits = *fDigits;  
+        
+  new(ldigits[fNdigits++]) AliFITDigit(npmt,  
+                                      timeCFD, timeLED, timeQT0, timeQT1);
+        
+}
+//____________________________________________________________________________
+void AliFITDigitizer::ResetDigits()
+{
+
+// Clears Digits
+
+  fNdigits = 0;
+  if (fDigits) fDigits->Clear();
+}