LCOV - code coverage report
Current view: top level - EVGEN - AliGenCocktailAfterBurner.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 207 0.5 %
Date: 2016-06-14 17:26:59 Functions: 1 16 6.2 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : /* $Id$ */
      17             : 
      18             : // 
      19             : // Container class for AliGenerator and AfterBurners 
      20             : // (which are AliGenerators as well) through recursion.
      21             : // The container is itself an AliGenerator a
      22             : // what is stored are not the pointers to the generators directly 
      23             : // but to objects of type
      24             : // AliGenCocktailAfterBurner entry.   
      25             : // The class provides also iterator functionality.  
      26             : // Author: andreas.morsch@cern.ch and piotr.skowronski@cern.ch
      27             : //
      28             : // 24.09.2001  Piotr Skowronski
      29             : //             debug -> gDebug,
      30             : //             fNEvents replaced with AliRunLoader::GetNumberOfEvents()
      31             : //
      32             : 
      33             : 
      34             : #include <Riostream.h>
      35             : 
      36             : #include <TList.h>
      37             : #include <TObjArray.h>
      38             : #include <TParticle.h>
      39             : 
      40             : #include "AliGenCocktailAfterBurner.h"
      41             : #include "AliGenCocktailEntry.h"
      42             : #include "AliGenCocktailEventHeader.h"
      43             : #include "AliCollisionGeometry.h"
      44             : #include "AliStack.h"
      45             : #include "AliMC.h"
      46             : #include "AliRun.h"
      47             : 
      48             : using std::cout;
      49             : using std::endl;
      50           6 : ClassImp(AliGenCocktailAfterBurner)
      51             : /*********************************************************************/ 
      52             : /*********************************************************************/ 
      53             : 
      54           0 :     AliGenCocktailAfterBurner::AliGenCocktailAfterBurner():
      55           0 :         fNAfterBurners(0),
      56           0 :         fAfterBurnerEntries(0),
      57           0 :         fGenerationDone(kFALSE),
      58           0 :         fInternalStacks(0),
      59           0 :         fCollisionGeometries(0),
      60           0 :         fHeaders(0),
      61           0 :         fCurrentEvent(0),
      62           0 :         fActiveStack(0),
      63           0 :         fActiveEvent(-1),
      64           0 :         fCurrentGenerator(0),
      65           0 :         fNBgEvents(0)
      66           0 : {
      67             : // Constructor
      68           0 :     if (gDebug > 0) 
      69           0 :         cout<<"AliGenCocktailAfterBurner::AliGenCocktailAfterBurner()"<<endl;
      70           0 :     SetName("AliGenCocktailAfterBurner");
      71           0 :     SetTitle("AliGenCocktailAfterBurner");
      72           0 : }
      73             : 
      74             : /*********************************************************************/ 
      75             : 
      76           0 : AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
      77           0 :   {
      78             : //destructor
      79             : 
      80           0 :     if (fInternalStacks) //delete stacks
      81             :      { 
      82           0 :        fInternalStacks->SetOwner();
      83           0 :        delete fInternalStacks;
      84             :     }
      85           0 :     if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
      86           0 :     Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
      87           0 :     if (fCollisionGeometries) {
      88           0 :       for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
      89           0 :         if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
      90           0 :       delete[] fCollisionGeometries;
      91             :     }
      92           0 :     if (fHeaders) {
      93           0 :       for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
      94           0 :         if (fHeaders[i]) delete fHeaders[i];
      95           0 :       delete[] fHeaders;
      96             :     }
      97           0 :   }
      98             : /*********************************************************************/ 
      99             : /*********************************************************************/ 
     100             : 
     101             : void AliGenCocktailAfterBurner::
     102             : AddAfterBurner(AliGenerator *AfterBurner, const char* Name, Float_t RateExp)
     103             : {
     104             : //
     105             : //  Forward parameters to the new AfterBurner
     106             :     
     107           0 :     if (gDebug>0)cout<<"AliGenCocktailAfterBurner::AddAfterBurner  Named "<<Name<<endl;
     108             : 
     109           0 :     if(TestBit(kPtRange) && !(AfterBurner->TestBit(kPtRange)) && !(AfterBurner->TestBit(kMomentumRange))) 
     110           0 :         AfterBurner->SetPtRange(fPtMin,fPtMax);
     111           0 :     if(TestBit(kMomentumRange) && !(AfterBurner->TestBit(kPtRange)) && !(AfterBurner->TestBit(kMomentumRange)))
     112           0 :         AfterBurner->SetMomentumRange(fPMin,fPMax);
     113             :     
     114           0 :     if (TestBit(kYRange) && !(AfterBurner->TestBit(kYRange)))
     115           0 :         AfterBurner->SetYRange(fYMin,fYMax);
     116           0 :     if (TestBit(kPhiRange) && !(AfterBurner->TestBit(kPhiRange)))
     117           0 :         AfterBurner->SetPhiRange(fPhiMin*180/TMath::Pi(),fPhiMax*180/TMath::Pi());
     118           0 :     if (TestBit(kThetaRange) && !(AfterBurner->TestBit(kThetaRange)) && !(AfterBurner->TestBit(kEtaRange)))
     119           0 :         AfterBurner->SetThetaRange(fThetaMin*180/TMath::Pi(),fThetaMax*180/TMath::Pi());
     120           0 :     if (!(AfterBurner->TestBit(kVertexRange))) {
     121           0 :         AfterBurner->SetOrigin(fOrigin[0], fOrigin[1], fOrigin[2]);
     122           0 :         AfterBurner->SetSigma(fOsigma[0], fOsigma[1], fOsigma[2]);
     123           0 :         AfterBurner->SetVertexSmear(fVertexSmear);
     124           0 :         AfterBurner->SetVertexSource(kContainer);
     125           0 :         AfterBurner->SetTimeOrigin(fTimeOrigin);
     126           0 :     }
     127           0 :     AfterBurner->SetTrackingFlag(fTrackIt);
     128             :     //AfterBurner->SetContainer(this);
     129             : 
     130             : //
     131             : //  Add AfterBurner to list   
     132             :     
     133             :     AliGenCocktailEntry *entry = 
     134           0 :         new AliGenCocktailEntry(AfterBurner, Name, RateExp);
     135           0 :     if (!fAfterBurnerEntries) fAfterBurnerEntries = new TList();
     136             :     
     137           0 :     fAfterBurnerEntries->Add(entry);
     138           0 :     fNAfterBurners++;
     139             : //
     140             :     
     141           0 : }
     142             : /*********************************************************************/ 
     143             : /*********************************************************************/ 
     144             : 
     145             : void AliGenCocktailAfterBurner::Init()
     146             : {
     147             : // Initialisation
     148           0 :   Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
     149           0 :     fGenerationDone = kFALSE;
     150           0 :     if (fInternalStacks) //delete stacks
     151             :      { 
     152           0 :        fInternalStacks->SetOwner();
     153           0 :        fInternalStacks->Delete(); //clean after previous generation cycle
     154           0 :      }
     155             : 
     156           0 :     if (fCollisionGeometries) {
     157           0 :       for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
     158           0 :         if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
     159           0 :       delete[] fCollisionGeometries;
     160             :     }
     161           0 :     if (fHeaders) {
     162           0 :       for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
     163           0 :         if (fHeaders[i]) delete fHeaders[i];
     164           0 :       delete[] fHeaders;
     165             :     }
     166             : 
     167           0 :     this->AliGenCocktail::Init(); 
     168             :     
     169           0 :     if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
     170           0 :     TIter next(fAfterBurnerEntries);
     171             :     AliGenCocktailEntry *entry;
     172             :     //
     173             :     // Loop over generators and initialize
     174           0 :     while((entry = (AliGenCocktailEntry*)next())) {
     175           0 :         entry->Generator()->Init();
     176             :     }  
     177           0 : }
     178             : /*********************************************************************/ 
     179             : /*********************************************************************/ 
     180             : 
     181             : void AliGenCocktailAfterBurner::Generate()
     182             : {
     183             : //
     184             : // Generate event
     185             : //  Firsts runs each generator for all events
     186             : //  than after burners ones for each event
     187             : //
     188             : //  It generates and processes all events during
     189             : //  first call only.
     190             : //  In next calls it just returns already generated 
     191             : //  and processed events to the gAlice
     192             : 
     193           0 :     if (gDebug>0)
     194           0 :       cout<<"#####################################"<<endl
     195           0 :           <<"#AliGenCocktailAfterBurner::Generate#"<<endl
     196           0 :           <<"#####################################"<<endl;
     197             :     // Initialize header
     198             :     //
     199             :     Int_t i; //iterator
     200             :     AliStack * stack;
     201             :     
     202           0 :     if (fGenerationDone)
     203             :     {//if generation is done (in first call) 
     204             :      //just copy particles from the stack to the gAlice
     205           0 :       SetTracks(++fCurrentEvent);
     206           0 :       fHeader = fHeaders[fCurrentEvent];
     207           0 :       gAlice->SetGenEventHeader(fHeader); 
     208           0 :       cout<<"Returning event " << fCurrentEvent<<endl;
     209           0 :       return;  
     210             :     }
     211             :     else
     212             :     { //Here we are in the first call of the method
     213           0 :         Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
     214           0 :         cout << "Number of events per run" <<  numberOfEvents << endl;
     215           0 :         TArrayF eventVertex;
     216           0 :         eventVertex.Set(3 * (numberOfEvents + fNBgEvents));
     217           0 :         TArrayF eventTime;
     218           0 :         eventTime.Set(numberOfEvents + fNBgEvents);
     219           0 :         fCurrentEvent=0;
     220             :       //Create stacks
     221           0 :         fInternalStacks      = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
     222           0 :         fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
     223           0 :         fHeaders             = new AliGenCocktailEventHeader*[numberOfEvents + fNBgEvents]; //Create array of headers   
     224             : 
     225           0 :         for(i = 0; i < numberOfEvents + fNBgEvents; i++) 
     226             :        {        
     227           0 :            stack = new AliStack(10000);
     228           0 :            stack->Reset();
     229           0 :            fInternalStacks->Add(stack);
     230           0 :            Vertex();
     231           0 :            for (Int_t j = 0; j < 3; j++) eventVertex[3 * i +  j] = fVertex[j];
     232           0 :            eventTime[i] = fTime;
     233           0 :            fHeaders[i] = new AliGenCocktailEventHeader();
     234           0 :            fCollisionGeometries[i] = 0;
     235             :        }
     236             : /*********************************************************************/ 
     237           0 :       TIter next(fEntries);
     238             :       AliGenCocktailEntry *entry;
     239           0 :       AliGenCocktailEntry *e1;
     240           0 :       AliGenCocktailEntry *e2;
     241             :       const TObjArray *partArray;
     242             :   //
     243             :   // Loop over generators and generate events
     244             :       Int_t igen=0;
     245           0 :       while((entry = (AliGenCocktailEntry*)next())) 
     246             :       {
     247           0 :         igen++;
     248           0 :         cout<<"Generator "<<igen<<"  : "<<entry->GetName()<<endl;
     249             : /***********************************************/
     250             : //First generator for all evenets, than second for all events, etc...
     251           0 :         for(i = 0; i < numberOfEvents + fNBgEvents; i++) 
     252             :         {  
     253           0 :             cout<<"                  EVENT "<<i << endl;
     254           0 :             stack = GetStack(i);
     255           0 :             partArray = stack->Particles();
     256           0 :             fCurrentGenerator = entry->Generator();
     257           0 :             fCurrentGenerator->SetStack(stack);
     258           0 :             if (igen ==1) 
     259             :             {
     260           0 :                 entry->SetFirst(0);
     261           0 :             } 
     262             :             else 
     263             :             {
     264           0 :                 entry->SetFirst((partArray->GetEntriesFast())+1);
     265             :             }
     266             :             // Set the vertex for the generator
     267           0 :             Int_t ioff = 3 * i;
     268           0 :             fCurrentGenerator->SetVertex(eventVertex.At(ioff), eventVertex.At(ioff + 1), eventVertex.At(ioff + 2));
     269           0 :             fCurrentGenerator->SetTime(eventTime.At(i));
     270           0 :             fHeader = fHeaders[i];
     271             :             // Set the vertex and time for the cocktail
     272           0 :             TArrayF v(3);
     273           0 :             for (Int_t j=0; j<3; j++) v[j] = eventVertex.At(ioff + j);
     274           0 :             fHeader->SetPrimaryVertex(v);
     275           0 :             fHeader->SetInteractionTime(eventTime.At(i));
     276             :             // Generate event
     277           0 :             fCurrentGenerator->Generate();
     278             :             //
     279           0 :             entry->SetLast(partArray->GetEntriesFast());
     280             :             
     281           0 :             if (fCurrentGenerator->ProvidesCollisionGeometry())  
     282           0 :               fCollisionGeometries[i] = 
     283           0 :                 new AliCollisionGeometry(*(fCurrentGenerator->CollisionGeometry()));
     284           0 :         } // event loop
     285             : /***********************************************/
     286             :       } // generator loop
     287           0 :       next.Reset();
     288           0 :       while((entry = (AliGenCocktailEntry*)next())) 
     289             :         {
     290           0 :           entry->PrintInfo();
     291             :         }
     292           0 :       for ( entry=FirstGenerator();entry;entry=NextGenerator() ) 
     293             :         {
     294           0 :           entry->PrintInfo();
     295             :         }
     296           0 :       for (FirstGeneratorPair(e1,e2); (e1&&e2); NextGeneratorPair(e1,e2) )
     297             :         {
     298           0 :           printf("\n -----------------------------");
     299           0 :           e1->PrintInfo();
     300           0 :           e2->PrintInfo();
     301             :         }
     302             :         
     303             :         
     304             :       /***********************************************/
     305             :       /*******After Burners Processing****************/
     306             :       /***********************************************/
     307           0 :       TIter nextAfterBurner(fAfterBurnerEntries);
     308             :       AliGenCocktailEntry *afterBurnerEntry;
     309             :       Int_t iab =0; //number of current after burner / counter
     310             :       
     311           0 :       cout<<"\n\nRunning After Burners"<<endl;
     312           0 :       while((afterBurnerEntry = (AliGenCocktailEntry*)nextAfterBurner()))
     313             :         {
     314           0 :           cout<<"After Burner "<<iab++<<"  :"<<afterBurnerEntry->GetName()<<endl;
     315           0 :           fCurrentGenerator = afterBurnerEntry->Generator();
     316           0 :           fCurrentGenerator->Generate();
     317             :         }
     318           0 :       cout<<endl<<"Finished. Processed "<<iab<<" After Burners"<<endl;
     319             : 
     320             :       /***********************************************/
     321             :       /***********************************************/
     322             :       /***********************************************/       
     323             :         
     324           0 :       fGenerationDone=kTRUE; 
     325           0 :       SetTracks(0); //copy event 0 to gAlice stack
     326             :         
     327             : /*********************************************************************/
     328             :       // Pass the header to gAlice
     329           0 :       fHeader = fHeaders[0];
     330           0 :       gAlice->SetGenEventHeader(fHeader); 
     331           0 :     } //else generated
     332           0 : }
     333             : /*********************************************************************/
     334             : /*********************************************************************/ 
     335             : 
     336             : AliStack* AliGenCocktailAfterBurner::GetStack(Int_t n) const
     337             : {
     338             : //Returns the pointer to the N'th stack (event)
     339           0 :   if( ( n<0 ) || ( n >= (GetNumberOfEvents()) ) )
     340             :     {
     341           0 :       Fatal("AliGenCocktailAfterBurner::GetStack","Asked for non existing stack (%d)",n);
     342           0 :       return 0; 
     343             :     }
     344           0 :     return ((AliStack*) fInternalStacks->At(n) );
     345           0 : }
     346             : 
     347             : /*********************************************************************/ 
     348             : /*********************************************************************/ 
     349             : 
     350             : AliCollisionGeometry* AliGenCocktailAfterBurner::GetCollisionGeometry(Int_t n) const
     351             : {
     352             : //Returns the pointer to the N'th stack (event)
     353           0 :   if( ( n<0 ) || ( n>=GetNumberOfEvents() ) )
     354             :     {
     355           0 :       Fatal("AliGenCocktailAfterBurner::GetCollisionGeometry","Asked for non existing stack (%d)",n);
     356           0 :       return 0; 
     357             :     }
     358           0 :     return fCollisionGeometries[n];
     359           0 : }
     360             : 
     361             : /*********************************************************************/ 
     362             : /*********************************************************************/ 
     363             : 
     364             : void AliGenCocktailAfterBurner::SetActiveEventNumber(Int_t actev)
     365             : {
     366             : //Set Active Events Number and Active Stack
     367             : //There is only one active event number
     368             : //Made fo convinience of work with AfterBurners (HBT processor)
     369             : 
     370           0 :     fActiveEvent = actev;
     371           0 :     fActiveStack = GetStack(actev);
     372           0 : }
     373             : /*********************************************************************/ 
     374             : /*********************************************************************/ 
     375             : 
     376             : void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
     377             : {
     378             : //Method which copies tracks from given stack to the
     379             : //gAlice's stack
     380           0 :     AliStack* instack = GetStack(stackno);
     381             :     Int_t done;
     382             :     Int_t parent; 
     383             :     Int_t pdg;
     384             :     Double_t px, py, pz, e, vx, vy, vz, tof, polx, poly, polz;
     385             :     TMCProcess mech;
     386           0 :     Int_t ntr;
     387             :     Float_t weight;
     388           0 :     TVector3 pol;
     389             :     Int_t is;
     390             :     
     391             :     TParticle * p;
     392           0 :     Int_t n = instack->GetNtrack();
     393           0 :     if (gDebug) 
     394             :     {
     395           0 :       cout<<"AliGenCocktailAfterBurner::SetTracks("<<stackno<<"). Number of particles is: "<<n<<"\n";
     396             :     }
     397             :     
     398           0 :     for(Int_t i = 0; i < n; i++)
     399             :     {
     400             :         
     401           0 :       p = instack->Particle(i);
     402           0 :       done = !p->TestBit(kDoneBit);
     403           0 :       parent = p->GetMother(0);
     404           0 :       pdg = p->GetPdgCode();
     405           0 :       px = p->Px();
     406           0 :       py = p->Py();
     407           0 :       pz = p->Pz();
     408           0 :       e  = p->Energy();
     409           0 :       vx = p->Vx();
     410           0 :       vy = p->Vy();
     411           0 :       vz = p->Vz();
     412           0 :       tof = p->T();
     413           0 :       p->GetPolarisation(pol);
     414           0 :       polx = pol.X();
     415           0 :       poly = pol.Y();
     416           0 :       polz = pol.Z();
     417           0 :       mech = AliGenCocktailAfterBurner::IntToMCProcess(p->GetUniqueID());
     418           0 :       weight = p->GetWeight();
     419           0 :       is = p->GetStatusCode();
     420             : 
     421           0 :       gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight, is);
     422             : 
     423           0 :       SetHighWaterMark(ntr) ; 
     424             : 
     425             :     }
     426           0 : }
     427             : /*********************************************************************/ 
     428             : /*********************************************************************/ 
     429             : 
     430             : TMCProcess AliGenCocktailAfterBurner::IntToMCProcess(Int_t no)
     431             : {
     432             :  //Mothod used to convert uniqueID (integer) to TMCProcess type
     433             :     const TMCProcess kMCprocesses[kMaxMCProcess] = 
     434             :     {
     435             :      kPNoProcess, kPMultipleScattering, kPEnergyLoss, kPMagneticFieldL, 
     436             :      kPDecay, kPPair, kPCompton, kPPhotoelectric, kPBrem, kPDeltaRay,
     437             :      kPAnnihilation, kPHadronic, kPNoProcess, kPEvaporation, kPNuclearFission,
     438             :      kPNuclearAbsorption, kPPbarAnnihilation, kPNCapture, kPHElastic, 
     439             :      kPHInhelastic, kPMuonNuclear, kPTOFlimit,kPPhotoFission, kPNoProcess, 
     440             :      kPRayleigh, kPNoProcess, kPNoProcess, kPNoProcess, kPNull, kPStop
     441             :     };
     442             :     
     443           0 :     for (Int_t i = 0;i<kMaxMCProcess;i++)
     444             :     {
     445           0 :       if (kMCprocesses[i] == no)
     446             :         {
     447           0 :           return kMCprocesses[i];
     448             :         }
     449             :     } 
     450           0 :     return kPNoProcess;
     451           0 : }
     452             : 

Generated by: LCOV version 1.11