]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PHOS/AliPHOSv0.cxx
New member functions for CPV clusterization
[u/mrichter/AliRoot.git] / PHOS / AliPHOSv0.cxx
index 25160638b0bd08cb3d528c3cdc60ef58898fc463..685d1de932f52b7a198460675dc430213e616449 100644 (file)
@@ -18,6 +18,8 @@
 //_________________________________________________________________________
 // Implementation version v0 of PHOS Manager class 
 // Layout EMC + PPSD has name GPS2  
+// An object of this class does not produce hits nor digits
+// It is the one to use if you do not want to produce outputs in TREEH or TREED
 //                  
 //*-- Author: Yves Schutz (SUBATECH)
 
@@ -27,6 +29,8 @@
 #include "TBRIK.h"
 #include "TNode.h"
 #include "TRandom.h"
+#include "TGeometry.h"
+
 
 // --- Standard library ---
 
 // --- AliRoot header files ---
 
 #include "AliPHOSv0.h"
-#include "AliPHOSHit.h"
-#include "AliPHOSDigit.h"
-#include "AliPHOSReconstructioner.h"
 #include "AliRun.h"
 #include "AliConst.h"
+#include "AliMC.h"
 
 ClassImp(AliPHOSv0)
 
-//____________________________________________________________________________
-AliPHOSv0::AliPHOSv0()
-{
-  // ctor
-  fNTmpHits = 0 ; 
-  fTmpHits  = 0 ; 
-}
-
 //____________________________________________________________________________
 AliPHOSv0::AliPHOSv0(const char *name, const char *title):
   AliPHOS(name,title)
 {
   // ctor : title is used to identify the layout
   //        GPS2 = 5 modules (EMC + PPSD)   
-  // We use 2 arrays of hits :
-  //
-  //   - fHits (the "normal" one), which retains the hits associated with
-  //     the current primary particle being tracked
-  //     (this array is reset after each primary has been tracked).
-  //
-  //   - fTmpHits, which retains all the hits of the current event. It 
-  //     is used for the digitization part.
-
-  fPinElectronicNoise = 0.010 ;
-  fDigitThreshold      = 1. ;   // 1 GeV 
-
-  // We do not want to save in TreeH the raw hits
-  // fHits   = new TClonesArray("AliPHOSHit",100) ;
-  // gAlice->AddHitList(fHits) ; 
-
-  // But save the cumulated hits instead (need to create the branch myself)
-  // It is put in the Digit Tree because the TreeH is filled after each primary
-  // and the TreeD at the end of the event (branch is set in FinishEvent() ).
-  
-  fTmpHits= new TClonesArray("AliPHOSHit",100) ;
-
-  fNTmpHits = fNhits = 0 ;
-
-  fDigits = new TClonesArray("AliPHOSDigit",100) ;
-
-
-  fIshunt     =  1 ; // All hits are associated with primary particles
  
   // gets an instance of the geometry parameters class  
-   
-  fGeom =  AliPHOSGeometry::GetInstance(title, "") ; 
 
-  if (fGeom->IsInitialized() ) 
-    cout << "AliPHOSv0 : PHOS geometry intialized for " << fGeom->GetName() << endl ;
-  else
-   cout << "AliPHOSv0 : PHOS geometry initialization failed !" << endl ;   
-}
-//____________________________________________________________________________
-AliPHOSv0::AliPHOSv0(AliPHOSReconstructioner * Reconstructioner, const char *name, const char *title):
-  AliPHOS(name,title)
-{
-  // ctor : title is used to identify the layout
-  //        GPS2 = 5 modules (EMC + PPSD)   
-  // We use 2 arrays of hits :
-  //
-  //   - fHits (the "normal" one), which retains the hits associated with
-  //     the current primary particle being tracked
-  //     (this array is reset after each primary has been tracked).
-  //
-  //   - fTmpHits, which retains all the hits of the current event. It 
-  //     is used for the digitization part.
+  if (strcmp(GetTitle(),"") != 0 ) 
+    fGeom =  AliPHOSGeometry::GetInstance(GetTitle(), "") ; 
 
-  fPinElectronicNoise = 0.010 ;
-
-  // We do not want to save in TreeH the raw hits
-  //fHits   = new TClonesArray("AliPHOSHit",100) ;
-
-  fDigits = new TClonesArray("AliPHOSDigit",100) ;
-  fTmpHits= new TClonesArray("AliPHOSHit",100) ;
-
-  fNTmpHits = fNhits = 0 ;
-
-  fIshunt     =  1 ; // All hits are associated with primary particles
-  // gets an instance of the geometry parameters class  
-  fGeom =  AliPHOSGeometry::GetInstance(title, "") ; 
-
-  if (fGeom->IsInitialized() ) 
-    cout << "AliPHOSv0 : PHOS geometry intialized for " << fGeom->GetName() << endl ;
-  else
-   cout << "AliPHOSv0 : PHOS geometry initialization failed !" << endl ;   
-
-  // Defining the PHOS Reconstructioner
- fReconstructioner = Reconstructioner ;
 }
 
-//____________________________________________________________________________
-AliPHOSv0::~AliPHOSv0()
-{
-  // dtor
-
-  fTmpHits->Delete() ; 
-  delete fTmpHits ;
-  fTmpHits = 0 ; 
-
-  fEmcClusters->Delete() ; 
-  delete fEmcClusters ; 
-  fEmcClusters = 0 ; 
-
-  fPpsdClusters->Delete() ;
-  delete fPpsdClusters ;
-  fPpsdClusters = 0 ; 
-
-  fTrackSegments->Delete() ; 
-  delete fTrackSegments ;
-  fTrackSegments = 0 ; 
-}
-
-//____________________________________________________________________________
-void AliPHOSv0::AddHit(Int_t primary, Int_t Id, Float_t * hits)
-{
-  // Add a hit to the hit list.
-  // A PHOS hit is the sum of all hits in a single crystal
-  //   or in a single PPSD gas cell
-
-  Int_t hitCounter ;
-  TClonesArray &ltmphits = *fTmpHits ;
-  AliPHOSHit *newHit ;
-  AliPHOSHit *curHit ;
-  //  AliPHOSHit *curHit2 ;
-  Bool_t deja = kFALSE ;
-
-  // In any case, fills the fTmpHit TClonesArray (with "accumulated hits")
-
-  newHit = new AliPHOSHit(primary, Id, hits) ;
-
-  // We do not want to save in TreeH the raw hits 
-  //  TClonesArray &lhits = *fHits;
-
-  for ( hitCounter = 0 ; hitCounter < fNTmpHits && !deja ; hitCounter++ ) {
-    curHit = (AliPHOSHit*) ltmphits[hitCounter] ;
-  if( *curHit == *newHit ) {
-    *curHit = *curHit + *newHit ;
-    deja = kTRUE ;
-    }
-  }
-         
-  if ( !deja ) {
-    new(ltmphits[fNTmpHits]) AliPHOSHit(*newHit) ;
-    fNTmpHits++ ;
-  }
-
-  // We do not want to save in TreeH the raw hits 
-  //   new(lhits[fNhits]) AliPHOSHit(*newHit) ;    
-  //   fNhits++ ;
-
-  // Please note that the fTmpHits array must survive up to the
-  // end of the events, so it does not appear e.g. in ResetHits() (
-  // which is called at the end of each primary).  
-
-  delete newHit;
-
-}
-
-
 //____________________________________________________________________________
 void AliPHOSv0::BuildGeometry()
 {
@@ -346,6 +201,9 @@ void AliPHOSv0:: BuildGeometryforPHOS(void)
    crystalsboxnode->SetLineColor(kColorXTAL) ; 
    fNodes->Add(crystalsboxnode) ; 
   }
+
+  delete[] rotname ;  
+  delete[] nodename ;
 }
 
 //____________________________________________________________________________
@@ -609,8 +467,8 @@ void AliPHOSv0:: BuildGeometryforPPSD(void)
     }
   } // PHOS modules
  
-  delete rotname ;  
-  delete nodename ; 
+  delete[] rotname ;  
+  delete[] nodename ; 
 
 }
 
@@ -1134,89 +992,6 @@ void AliPHOSv0::CreateGeometryforPPSD()
    
 }
 
-//___________________________________________________________________________
-Int_t AliPHOSv0::Digitize(Float_t Energy)
-{
-  // Applies the energy calibration
-  
-  Float_t fB = 100000000. ;
-  Float_t fA = 0. ;
-  Int_t chan = Int_t(fA + Energy*fB ) ;
-  return chan ;
-}
-
-//___________________________________________________________________________
-void AliPHOSv0::FinishEvent()
-{
-  // Makes the digits from the sum of summed hit in a single crystal or PPSD gas cell
-  // Adds to the energy the electronic noise
-  // Keeps digits with energy above fDigitThreshold
-
-  // Save the cumulated hits instead of raw hits (need to create the branch myself)
-  // It is put in the Digit Tree because the TreeH is filled after each primary
-  // and the TreeD at the end of the event.
-  if ( fTmpHits && gAlice->TreeD() ) {
-    char branchname[10] ;
-    sprintf(branchname, "%sCH", GetName()) ;
-    gAlice->TreeD()->Branch(branchname, &fTmpHits, fBufferSize) ; 
-  } else 
-    cout << "AliPHOSv0::AliPHOSv0: Failed to create branch PHOSCH in TreeD " << endl ;  
-  
-  Int_t i ;
-  Int_t relid[4];
-  Int_t j ; 
-  TClonesArray &lDigits = *fDigits ;
-  AliPHOSHit  * hit ;
-  AliPHOSDigit * newdigit ;
-  AliPHOSDigit * curdigit ;
-  Bool_t deja = kFALSE ; 
-  
-  for ( i = 0 ; i < fNTmpHits ; i++ ) {
-    hit = (AliPHOSHit*)fTmpHits->At(i) ;
-    newdigit = new AliPHOSDigit( hit->GetPrimary(), hit->GetId(), Digitize( hit->GetEnergy() ) ) ;
-    deja =kFALSE ;
-    for ( j = 0 ; j < fNdigits ;  j++) { 
-      curdigit = (AliPHOSDigit*) lDigits[j] ;
-      if ( *curdigit == *newdigit) {
-       *curdigit = *curdigit + *newdigit ; 
-       deja = kTRUE ; 
-      }
-    }
-    if ( !deja ) {
-      new(lDigits[fNdigits]) AliPHOSDigit(* newdigit) ;
-      fNdigits++ ;  
-    }
-    delete newdigit ;    
-  } 
-  
-  // Noise induced by the PIN diode of the PbWO crystals
-
-  Float_t energyandnoise ;
-  for ( i = 0 ; i < fNdigits ; i++ ) {
-    newdigit =  (AliPHOSDigit * ) fDigits->At(i) ;
-    fGeom->AbsToRelNumbering(newdigit->GetId(), relid) ;
-
-    if (relid[1]==0){   // Digits belong to EMC (PbW0_4 crystals)
-      energyandnoise = newdigit->GetAmp() + Digitize(gRandom->Gaus(0., fPinElectronicNoise)) ;
-
-      if (energyandnoise < 0 ) 
-       energyandnoise = 0 ;
-
-      if ( newdigit->GetAmp() < fDigitThreshold ) // if threshold not surpassed, remove digit from list
-       fDigits->RemoveAt(i) ; 
-    }
-  }
-  
-  fDigits->Compress() ;  
-
-  fNdigits =  fDigits->GetEntries() ; 
-  for (i = 0 ; i < fNdigits ; i++) { 
-    newdigit = (AliPHOSDigit *) fDigits->At(i) ; 
-    newdigit->SetIndexInList(i) ; 
-  }
-
-}
 
 //____________________________________________________________________________
 void AliPHOSv0::Init(void)
@@ -1233,204 +1008,13 @@ void AliPHOSv0::Init(void)
 
   // Here the PHOS initialisation code (if any!)
 
+  if (fGeom!=0)  
+    cout << "AliPHOS" << Version() << " : PHOS geometry intialized for " << fGeom->GetName() << endl ;
+  else
+    cout << "AliPHOS" << Version() << " : PHOS geometry initialization failed !" << endl ;   
+  
   for(i=0;i<80;i++) printf("*");
   printf("\n");
   
 }
 
-//___________________________________________________________________________
-void AliPHOSv0::MakeBranch(Option_t* opt)
-{  
-  // Create new branche in the current Root Tree in the digit Tree
-
-  AliDetector::MakeBranch(opt) ;
-  
-  char branchname[10];
-  sprintf(branchname,"%s",GetName());
-  char *cdD = strstr(opt,"D");
-  
-  if (fDigits && gAlice->TreeD() && cdD) {
-    gAlice->TreeD()->Branch(branchname, &fDigits, fBufferSize);
-  }
-}
-
-//_____________________________________________________________________________
-void AliPHOSv0::Reconstruction(AliPHOSReconstructioner * Reconstructioner)
-{ 
-  // 1. Reinitializes the existing RecPoint, TrackSegment, and RecParticles Lists and 
-  // 2. Creates TreeR wit a branch for each list
-  // 3. Steers the reconstruction processes
-  // 4. Saves the 3 lists in TreeR
-  // 5. Write the Tree to File
-  
-  fReconstructioner = Reconstructioner ;
-  
-  char branchname[10] ;
-
-  // 1.
-
-  gAlice->MakeTree("R") ; 
-  Int_t splitlevel = 0 ; 
-  
-  if (fEmcClusters) { 
-    fEmcClusters->Delete() ; 
-    delete fEmcClusters ;
-    fEmcClusters = 0 ; 
-  }
-
-  //  fEmcClusters= new RecPointsList("AliPHOSEmcRecPoint", 100) ; if TClonesArray
-  fEmcClusters= new RecPointsList(100) ; 
-
-  if ( fEmcClusters && gAlice->TreeR() ) {
-    sprintf(branchname,"%sEmcRP",GetName()) ;
-    
-    // gAlice->TreeR()->Branch(branchname, &fEmcClusters, fBufferSize); if TClonesArray
-    gAlice->TreeR()->Branch(branchname, "TObjArray", &fEmcClusters, fBufferSize, splitlevel) ; 
-  }
-
-  if (fPpsdClusters) { 
-    fPpsdClusters->Delete() ; 
-    delete fPpsdClusters ; 
-    fPpsdClusters = 0 ; 
-  }
-
-  //  fPpsdClusters = new RecPointsList("AliPHOSPpsdRecPoint", 100) ; if TClonesArray
-  fPpsdClusters = new RecPointsList(100) ;
-
-  if ( fPpsdClusters && gAlice->TreeR() ) {
-    sprintf(branchname,"%sPpsdRP",GetName()) ;
-     
-     // gAlice->TreeR()->Branch(branchname, &fPpsdClusters, fBufferSize); if TClonesArray
-    gAlice->TreeR()->Branch(branchname, "TObjArray", &fPpsdClusters, fBufferSize, splitlevel);
-  }
-
-  if (fTrackSegments) { 
-   fTrackSegments->Delete() ; 
-    delete fTrackSegments ; 
-    fTrackSegments = 0 ; 
-  }
-
-  fTrackSegments = new TrackSegmentsList("AliPHOSTrackSegment", 100) ;
-  if ( fTrackSegments && gAlice->TreeR() ) { 
-    sprintf(branchname,"%sTS",GetName()) ;
-    gAlice->TreeR()->Branch(branchname, &fTrackSegments, fBufferSize);
-  }
-
-  if (fRecParticles) {  
-    fRecParticles->Delete() ; 
-    delete fRecParticles ; 
-    fRecParticles = 0 ; 
-  }
-  fRecParticles = new RecParticlesList("AliPHOSRecParticle", 100) ;
-  if ( fRecParticles && gAlice->TreeR() ) { 
-     sprintf(branchname,"%sRP",GetName()) ;
-     gAlice->TreeR()->Branch(branchname, &fRecParticles, fBufferSize);
-  }
-  
-  // 3.
-
-  fReconstructioner->Make(fDigits, fEmcClusters, fPpsdClusters, fTrackSegments, fRecParticles);
-
-  // 4. Expand or Shrink the arrays to the proper size
-  
-  Int_t size ;
-  
-  size = fEmcClusters->GetEntries() ;
-  fEmcClusters->Expand(size) ;
-  size = fPpsdClusters->GetEntries() ;
-  fPpsdClusters->Expand(size) ;
-
-  size = fTrackSegments->GetEntries() ;
-  fTrackSegments->Expand(size) ;
-
-  size = fRecParticles->GetEntries() ;
-  fRecParticles->Expand(size) ;
-
-  gAlice->TreeR()->Fill() ;
-  // 5.
-
-  gAlice->TreeR()->Write() ;
-   
-}
-
-//____________________________________________________________________________
-void AliPHOSv0::ResetDigits()
-{
-  // May sound strange, but cumulative hits are store in digits Tree
-
-  if(  fTmpHits ) {
-    fTmpHits->Delete();
-    fNTmpHits = 0 ;
-  }
-}
-  
-//____________________________________________________________________________
-void AliPHOSv0::StepManager(void)
-{
-  // Accumulates hits as long as the track stays in a single crystal or PPSD gas Cell
-
-  Int_t          relid[4] ;      // (box, layer, row, column) indices
-  Float_t        xyze[4] ;       // position wrt MRS and energy deposited
-  TLorentzVector pos ;
-  Int_t copy ;
-
-  Int_t primary =  gAlice->GetPrimary( gAlice->CurrentTrack() ); 
-  TString name = fGeom->GetName() ; 
-  if ( name == "GPS2" ) { // the CPV is a PPSD
-    if( gMC->CurrentVolID(copy) == gMC->VolId("GCEL") ) // We are inside a gas cell 
-    {
-      gMC->TrackPosition(pos) ;
-      xyze[0] = pos[0] ;
-      xyze[1] = pos[1] ;
-      xyze[2] = pos[2] ;
-      xyze[3] = gMC->Edep() ; 
-
-      if ( xyze[3] != 0 ) { // there is deposited energy 
-               gMC->CurrentVolOffID(5, relid[0]) ;  // get the PHOS Module number
-               gMC->CurrentVolOffID(3, relid[1]) ;  // get the Micromegas Module number 
-      // 1-> Geom->GetNumberOfModulesPhi() *  fGeom->GetNumberOfModulesZ() upper                         
-      //  >  fGeom->GetNumberOfModulesPhi()  *  fGeom->GetNumberOfModulesZ() lower
-               gMC->CurrentVolOffID(1, relid[2]) ;  // get the row number of the cell
-        gMC->CurrentVolID(relid[3]) ;        // get the column number 
-
-       // get the absolute Id number
-
-       Int_t absid ; 
-               fGeom->RelToAbsNumbering(relid, absid) ; 
-
-       // add current hit to the hit list      
-       AddHit(primary, absid, xyze);
-
-      } // there is deposited energy 
-     } // We are inside the gas of the CPV  
-   } // GPS2 configuration
-  
-   if(gMC->CurrentVolID(copy) == gMC->VolId("PXTL") )  //  We are inside a PBWO crystal
-     {
-       gMC->TrackPosition(pos) ;
-       xyze[0] = pos[0] ;
-       xyze[1] = pos[1] ;
-       xyze[2] = pos[2] ;
-       xyze[3] = gMC->Edep() ;
-
-       if ( xyze[3] != 0 ) {
-          gMC->CurrentVolOffID(10, relid[0]) ; // get the PHOS module number ;
-          relid[1] = 0   ;                    // means PBW04
-          gMC->CurrentVolOffID(4, relid[2]) ; // get the row number inside the module
-          gMC->CurrentVolOffID(3, relid[3]) ; // get the cell number inside the module
-
-      // get the absolute Id number
-
-          Int_t absid ; 
-          fGeom->RelToAbsNumbering(relid, absid) ; 
-      // add current hit to the hit list
-
-          AddHit(primary, absid, xyze);
-    
-       } // there is deposited energy
-    } // we are inside a PHOS Xtal
-}
-