ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, 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.                  *
 **************************************************************************/

/* $Id$ */

//_________________________________________________________________________
//*-- Implementation version v1 of EMCAL Manager class 
//*-- An object of this class does not produce digits
//*-- It is the one to use if you do want to produce outputs in TREEH 
//*--                  
//*-- Author: Sahal Yacoob (LBL /UCT)
//*--       : Jennifer Klay (LBL)
// This Class not stores information on all particles prior to EMCAL entry - in order to facilitate analysis.
// This is done by setting fIShunt =2, and flagging all parents of particles entering the EMCAL.

// 15/02/2002 .... Yves Schutz
//  1. fSamplingFraction and fLayerToPreshowerRatio have been removed
//  2. Timing signal is collected and added to hit

// --- ROOT system ---
#include <TClonesArray.h>
#include <TParticle.h>
#include <TVirtualMC.h>

// --- Standard library ---

// --- AliRoot header files ---
#include "AliEMCALv1.h"
#include "AliEMCALHit.h"
#include "AliEMCALGeometry.h"
#include "AliRun.h"
#include "AliMC.h"
#include "AliStack.h"

using std::cout;
using std::endl;
ClassImp(AliEMCALv1)


//______________________________________________________________________
AliEMCALv1::AliEMCALv1()
  : AliEMCALv0(), 
    fCurPrimary(-1), 
    fCurParent(-1), 
    fCurTrack(-1),
    fTimeCut(30e-09)
{
  // default ctor
}

//______________________________________________________________________
AliEMCALv1::AliEMCALv1(const char *name, const char *title, 
                       const Bool_t checkGeoAndRun)
  : AliEMCALv0(name,title,checkGeoAndRun), 
    fCurPrimary(-1), 
    fCurParent(-1), 
    fCurTrack(-1), 
    fTimeCut(30e-09)
{
    // Standard Creator.

    fHits= new TClonesArray("AliEMCALHit",1000);
    //    gAlice->GetMCApp()->AddHitList(fHits); // 20-dec-04 - advice of Andreas

    fNhits = 0;
    fIshunt     =  2; // All hits are associated with particles entering the calorimeter
}

//______________________________________________________________________
AliEMCALv1::~AliEMCALv1(){
  // dtor
  
  if ( fHits ) {
    fHits->Clear();
    delete fHits;
    fHits = 0;
  }
}

//______________________________________________________________________
void AliEMCALv1::AddHit(Int_t shunt, Int_t primary, Int_t tracknumber, Int_t iparent, Float_t ienergy, 
			Int_t id, Float_t * hits,Float_t * p){
    // Add a hit to the hit list.
    // An EMCAL hit is the sum of all hits in a tower section
    //   originating from the same entering particle 
    Int_t hitCounter=0;
    
    AliEMCALHit *newHit=0;
    AliEMCALHit *curHit=0;
    Bool_t deja = kFALSE;

    newHit = new AliEMCALHit(shunt, primary, tracknumber, iparent, ienergy, id, hits, p);
     for ( hitCounter = fNhits-1; hitCounter >= 0 && !deja; hitCounter-- ) {
	curHit = (AliEMCALHit*) (*fHits)[hitCounter];
	// We add hits with the same tracknumber, while GEANT treats
	// primaries succesively
	if(curHit->GetPrimary() != primary) 
	  break;
	if( *curHit == *newHit ) {
	    *curHit = *curHit + *newHit;
	    deja = kTRUE;
	    } // end if
    } // end for hitCounter
    
    if ( !deja ) {
	new((*fHits)[fNhits]) AliEMCALHit(*newHit);
	fNhits++;
    } // end if
    
    delete newHit;
}
//______________________________________________________________________
void AliEMCALv1::StepManager(void){
  // Accumulates hits as long as the track stays in a tower

  Int_t          id[2]={0,0};           // (phi, Eta) indices
  // position wrt MRS and energy deposited
  Float_t        xyzte[5]={0.,0.,0.,0.,0.};// position wrt MRS, time and energy deposited
  Float_t        pmom[4]={0.,0.,0.,0.};
  TLorentzVector pos; // Lorentz vector of the track current position.
  TLorentzVector mom; // Lorentz vector of the track current momentum.
  Int_t tracknumber =  gAlice->GetMCApp()->GetCurrentTrackNumber();
  static Float_t ienergy = 0;
  Int_t copy = 0;
  
  AliEMCALGeometry * geom = GetGeometry() ; 

  TParticle *part=0;
  Int_t parent=-1;

  static Int_t idXPHI = TVirtualMC::GetMC()->VolId("XPHI");
  if(TVirtualMC::GetMC()->CurrentVolID(copy) == idXPHI ) { // We are in a Scintillator Layer 
    Float_t depositedEnergy ; 
    
    if( ((depositedEnergy = TVirtualMC::GetMC()->Edep()) > 0.)  && (TVirtualMC::GetMC()->TrackTime() < fTimeCut)){// Track is inside a scintillator and deposits some energy
       if (fCurPrimary==-1) 
	fCurPrimary=gAlice->GetMCApp()->GetPrimary(tracknumber);

      if (fCurParent==-1 || tracknumber != fCurTrack) {
	// Check parentage
	//Int_t parent=tracknumber;
	parent=tracknumber;
	if (fCurParent != -1) {
	  while (parent != fCurParent && parent != -1) {
	    //TParticle *part=gAlice->GetMCApp()->Particle(parent);
	    part=gAlice->GetMCApp()->Particle(parent);
	    parent=part->GetFirstMother();
	  }
	}
	if (fCurParent==-1 || parent==-1) {
	  //Int_t parent=tracknumber;
	  //TParticle *part=gAlice->GetMCApp()->Particle(parent);
	  parent=tracknumber;
	  part=gAlice->GetMCApp()->Particle(parent);
	  while (parent != -1 && geom->IsInEMCAL(part->Vx(),part->Vy(),part->Vz())) {
	    parent=part->GetFirstMother();
	    if (parent!=-1) 
	      part=gAlice->GetMCApp()->Particle(parent);
	  } 
	  fCurParent=parent;
	  if (fCurParent==-1)
	    Error("StepManager","Cannot find parent");
	  else {
	    //TParticle *part=gAlice->GetMCApp()->Particle(fCurParent);
	    part=gAlice->GetMCApp()->Particle(fCurParent);
	    ienergy = part->Energy(); 
	  }
	  while (parent != -1) {
	    part=gAlice->GetMCApp()->Particle(parent);
	    part->SetBit(kKeepBit);
	    parent=part->GetFirstMother();
	  }
	}
	fCurTrack=tracknumber;
      }    
      TVirtualMC::GetMC()->TrackPosition(pos);
      xyzte[0] = pos[0];
      xyzte[1] = pos[1];
      xyzte[2] = pos[2];
      xyzte[3] = TVirtualMC::GetMC()->TrackTime() ;       
      
      TVirtualMC::GetMC()->TrackMomentum(mom);
      pmom[0] = mom[0];
      pmom[1] = mom[1];
      pmom[2] = mom[2];
      pmom[3] = mom[3];
      
      TVirtualMC::GetMC()->CurrentVolOffID(1, id[0]); // get the POLY copy number;
      TVirtualMC::GetMC()->CurrentVolID(id[1]); // get the phi number inside the layer
      
      Int_t tower = (id[0]-1) % geom->GetNZ() + 1 + (id[1] - 1) * geom->GetNZ() ;  
      Int_t layer = static_cast<Int_t>((id[0]-1)/(geom->GetNZ())) + 1 ; 
      Int_t absid = tower; 
      Int_t nlayers = geom->GetNECLayers();
      if ((layer > nlayers)||(layer<1)) 
        Fatal("StepManager", "Wrong calculation of layer number: layer = %d > %d\n", layer, nlayers) ;

      Float_t lightYield =  depositedEnergy ;
      // Apply Birk's law (copied from G3BIRK)

      if (TVirtualMC::GetMC()->TrackCharge()!=0) { // Check
	  Float_t birkC1Mod = 0;
	if (fBirkC0==1){ // Apply correction for higher charge states
	  if (TMath::Abs(TVirtualMC::GetMC()->TrackCharge())>=2)
	    birkC1Mod=fBirkC1*7.2/12.6;
	  else
	    birkC1Mod=fBirkC1;
	}
	Float_t dedxcm=0.;
	if (TVirtualMC::GetMC()->TrackStep()>0) 
	  dedxcm=1000.*TVirtualMC::GetMC()->Edep()/TVirtualMC::GetMC()->TrackStep();
	else
	  dedxcm=0;
	lightYield=lightYield/(1.+birkC1Mod*dedxcm+fBirkC2*dedxcm*dedxcm);
      } 

      // use sampling fraction to get original energy --HG
      xyzte[4] = lightYield * geom->GetSampling();
        
      if (gDebug == 2) 
	printf("StepManager: id0 = %d, id1 = %d, absid = %d tower = %d layer = %d energy = %f\n", id[0], id[1], absid, tower, layer, xyzte[4]) ;

      AddHit(fIshunt, fCurPrimary,tracknumber, fCurParent, ienergy, absid,  xyzte, pmom);
    } // there is deposited energy
  }
}

//___________________________________________________________
void AliEMCALv1::RemapTrackHitIDs(Int_t *map) {
  // remap track index numbers for primary and parent indices
  // (Called by AliStack::PurifyKine)
  if (Hits()==0)
    return;
  TIter hitIter(Hits());
  Int_t iHit=0;
  while (AliEMCALHit *hit=dynamic_cast<AliEMCALHit*>(hitIter()) ) {
    if (map[hit->GetIparent()]==-99)
      cout << "Remapping, found -99 for parent id " << hit->GetIparent() << ", " << map[hit->GetIparent()] << ", iHit " << iHit << endl;
    hit->SetIparent(map[hit->GetIparent()]);
    if (map[hit->GetPrimary()]==-99)
      cout << "Remapping, found -99 for primary id " << hit->GetPrimary() << ", " << map[hit->GetPrimary()] << ", iHit " << iHit << endl;
    hit->SetPrimary(map[hit->GetPrimary()]);
    iHit++;
  }
}

//___________________________________________________________
void AliEMCALv1::FinishPrimary() {
  // finish primary
  fCurPrimary=-1;
  fCurParent=-1;
  fCurTrack=-1;
}
 AliEMCALv1.cxx:1
 AliEMCALv1.cxx:2
 AliEMCALv1.cxx:3
 AliEMCALv1.cxx:4
 AliEMCALv1.cxx:5
 AliEMCALv1.cxx:6
 AliEMCALv1.cxx:7
 AliEMCALv1.cxx:8
 AliEMCALv1.cxx:9
 AliEMCALv1.cxx:10
 AliEMCALv1.cxx:11
 AliEMCALv1.cxx:12
 AliEMCALv1.cxx:13
 AliEMCALv1.cxx:14
 AliEMCALv1.cxx:15
 AliEMCALv1.cxx:16
 AliEMCALv1.cxx:17
 AliEMCALv1.cxx:18
 AliEMCALv1.cxx:19
 AliEMCALv1.cxx:20
 AliEMCALv1.cxx:21
 AliEMCALv1.cxx:22
 AliEMCALv1.cxx:23
 AliEMCALv1.cxx:24
 AliEMCALv1.cxx:25
 AliEMCALv1.cxx:26
 AliEMCALv1.cxx:27
 AliEMCALv1.cxx:28
 AliEMCALv1.cxx:29
 AliEMCALv1.cxx:30
 AliEMCALv1.cxx:31
 AliEMCALv1.cxx:32
 AliEMCALv1.cxx:33
 AliEMCALv1.cxx:34
 AliEMCALv1.cxx:35
 AliEMCALv1.cxx:36
 AliEMCALv1.cxx:37
 AliEMCALv1.cxx:38
 AliEMCALv1.cxx:39
 AliEMCALv1.cxx:40
 AliEMCALv1.cxx:41
 AliEMCALv1.cxx:42
 AliEMCALv1.cxx:43
 AliEMCALv1.cxx:44
 AliEMCALv1.cxx:45
 AliEMCALv1.cxx:46
 AliEMCALv1.cxx:47
 AliEMCALv1.cxx:48
 AliEMCALv1.cxx:49
 AliEMCALv1.cxx:50
 AliEMCALv1.cxx:51
 AliEMCALv1.cxx:52
 AliEMCALv1.cxx:53
 AliEMCALv1.cxx:54
 AliEMCALv1.cxx:55
 AliEMCALv1.cxx:56
 AliEMCALv1.cxx:57
 AliEMCALv1.cxx:58
 AliEMCALv1.cxx:59
 AliEMCALv1.cxx:60
 AliEMCALv1.cxx:61
 AliEMCALv1.cxx:62
 AliEMCALv1.cxx:63
 AliEMCALv1.cxx:64
 AliEMCALv1.cxx:65
 AliEMCALv1.cxx:66
 AliEMCALv1.cxx:67
 AliEMCALv1.cxx:68
 AliEMCALv1.cxx:69
 AliEMCALv1.cxx:70
 AliEMCALv1.cxx:71
 AliEMCALv1.cxx:72
 AliEMCALv1.cxx:73
 AliEMCALv1.cxx:74
 AliEMCALv1.cxx:75
 AliEMCALv1.cxx:76
 AliEMCALv1.cxx:77
 AliEMCALv1.cxx:78
 AliEMCALv1.cxx:79
 AliEMCALv1.cxx:80
 AliEMCALv1.cxx:81
 AliEMCALv1.cxx:82
 AliEMCALv1.cxx:83
 AliEMCALv1.cxx:84
 AliEMCALv1.cxx:85
 AliEMCALv1.cxx:86
 AliEMCALv1.cxx:87
 AliEMCALv1.cxx:88
 AliEMCALv1.cxx:89
 AliEMCALv1.cxx:90
 AliEMCALv1.cxx:91
 AliEMCALv1.cxx:92
 AliEMCALv1.cxx:93
 AliEMCALv1.cxx:94
 AliEMCALv1.cxx:95
 AliEMCALv1.cxx:96
 AliEMCALv1.cxx:97
 AliEMCALv1.cxx:98
 AliEMCALv1.cxx:99
 AliEMCALv1.cxx:100
 AliEMCALv1.cxx:101
 AliEMCALv1.cxx:102
 AliEMCALv1.cxx:103
 AliEMCALv1.cxx:104
 AliEMCALv1.cxx:105
 AliEMCALv1.cxx:106
 AliEMCALv1.cxx:107
 AliEMCALv1.cxx:108
 AliEMCALv1.cxx:109
 AliEMCALv1.cxx:110
 AliEMCALv1.cxx:111
 AliEMCALv1.cxx:112
 AliEMCALv1.cxx:113
 AliEMCALv1.cxx:114
 AliEMCALv1.cxx:115
 AliEMCALv1.cxx:116
 AliEMCALv1.cxx:117
 AliEMCALv1.cxx:118
 AliEMCALv1.cxx:119
 AliEMCALv1.cxx:120
 AliEMCALv1.cxx:121
 AliEMCALv1.cxx:122
 AliEMCALv1.cxx:123
 AliEMCALv1.cxx:124
 AliEMCALv1.cxx:125
 AliEMCALv1.cxx:126
 AliEMCALv1.cxx:127
 AliEMCALv1.cxx:128
 AliEMCALv1.cxx:129
 AliEMCALv1.cxx:130
 AliEMCALv1.cxx:131
 AliEMCALv1.cxx:132
 AliEMCALv1.cxx:133
 AliEMCALv1.cxx:134
 AliEMCALv1.cxx:135
 AliEMCALv1.cxx:136
 AliEMCALv1.cxx:137
 AliEMCALv1.cxx:138
 AliEMCALv1.cxx:139
 AliEMCALv1.cxx:140
 AliEMCALv1.cxx:141
 AliEMCALv1.cxx:142
 AliEMCALv1.cxx:143
 AliEMCALv1.cxx:144
 AliEMCALv1.cxx:145
 AliEMCALv1.cxx:146
 AliEMCALv1.cxx:147
 AliEMCALv1.cxx:148
 AliEMCALv1.cxx:149
 AliEMCALv1.cxx:150
 AliEMCALv1.cxx:151
 AliEMCALv1.cxx:152
 AliEMCALv1.cxx:153
 AliEMCALv1.cxx:154
 AliEMCALv1.cxx:155
 AliEMCALv1.cxx:156
 AliEMCALv1.cxx:157
 AliEMCALv1.cxx:158
 AliEMCALv1.cxx:159
 AliEMCALv1.cxx:160
 AliEMCALv1.cxx:161
 AliEMCALv1.cxx:162
 AliEMCALv1.cxx:163
 AliEMCALv1.cxx:164
 AliEMCALv1.cxx:165
 AliEMCALv1.cxx:166
 AliEMCALv1.cxx:167
 AliEMCALv1.cxx:168
 AliEMCALv1.cxx:169
 AliEMCALv1.cxx:170
 AliEMCALv1.cxx:171
 AliEMCALv1.cxx:172
 AliEMCALv1.cxx:173
 AliEMCALv1.cxx:174
 AliEMCALv1.cxx:175
 AliEMCALv1.cxx:176
 AliEMCALv1.cxx:177
 AliEMCALv1.cxx:178
 AliEMCALv1.cxx:179
 AliEMCALv1.cxx:180
 AliEMCALv1.cxx:181
 AliEMCALv1.cxx:182
 AliEMCALv1.cxx:183
 AliEMCALv1.cxx:184
 AliEMCALv1.cxx:185
 AliEMCALv1.cxx:186
 AliEMCALv1.cxx:187
 AliEMCALv1.cxx:188
 AliEMCALv1.cxx:189
 AliEMCALv1.cxx:190
 AliEMCALv1.cxx:191
 AliEMCALv1.cxx:192
 AliEMCALv1.cxx:193
 AliEMCALv1.cxx:194
 AliEMCALv1.cxx:195
 AliEMCALv1.cxx:196
 AliEMCALv1.cxx:197
 AliEMCALv1.cxx:198
 AliEMCALv1.cxx:199
 AliEMCALv1.cxx:200
 AliEMCALv1.cxx:201
 AliEMCALv1.cxx:202
 AliEMCALv1.cxx:203
 AliEMCALv1.cxx:204
 AliEMCALv1.cxx:205
 AliEMCALv1.cxx:206
 AliEMCALv1.cxx:207
 AliEMCALv1.cxx:208
 AliEMCALv1.cxx:209
 AliEMCALv1.cxx:210
 AliEMCALv1.cxx:211
 AliEMCALv1.cxx:212
 AliEMCALv1.cxx:213
 AliEMCALv1.cxx:214
 AliEMCALv1.cxx:215
 AliEMCALv1.cxx:216
 AliEMCALv1.cxx:217
 AliEMCALv1.cxx:218
 AliEMCALv1.cxx:219
 AliEMCALv1.cxx:220
 AliEMCALv1.cxx:221
 AliEMCALv1.cxx:222
 AliEMCALv1.cxx:223
 AliEMCALv1.cxx:224
 AliEMCALv1.cxx:225
 AliEMCALv1.cxx:226
 AliEMCALv1.cxx:227
 AliEMCALv1.cxx:228
 AliEMCALv1.cxx:229
 AliEMCALv1.cxx:230
 AliEMCALv1.cxx:231
 AliEMCALv1.cxx:232
 AliEMCALv1.cxx:233
 AliEMCALv1.cxx:234
 AliEMCALv1.cxx:235
 AliEMCALv1.cxx:236
 AliEMCALv1.cxx:237
 AliEMCALv1.cxx:238
 AliEMCALv1.cxx:239
 AliEMCALv1.cxx:240
 AliEMCALv1.cxx:241
 AliEMCALv1.cxx:242
 AliEMCALv1.cxx:243
 AliEMCALv1.cxx:244
 AliEMCALv1.cxx:245
 AliEMCALv1.cxx:246
 AliEMCALv1.cxx:247
 AliEMCALv1.cxx:248
 AliEMCALv1.cxx:249
 AliEMCALv1.cxx:250
 AliEMCALv1.cxx:251
 AliEMCALv1.cxx:252
 AliEMCALv1.cxx:253
 AliEMCALv1.cxx:254
 AliEMCALv1.cxx:255
 AliEMCALv1.cxx:256
 AliEMCALv1.cxx:257
 AliEMCALv1.cxx:258
 AliEMCALv1.cxx:259
 AliEMCALv1.cxx:260
 AliEMCALv1.cxx:261
 AliEMCALv1.cxx:262
 AliEMCALv1.cxx:263
 AliEMCALv1.cxx:264
 AliEMCALv1.cxx:265