Skip to content
Snippets Groups Projects
Analysis.cxx 8.94 KiB
Newer Older
adrien-matta's avatar
adrien-matta committed
#include "Analysis.h"

int main(int argc, char** argv){
  // command line parsing
  NPOptionManager* myOptionManager = NPOptionManager::getInstance(argc,argv);

  // Instantiate RootInput
  string runToReadfileName = myOptionManager->GetRunToReadFile();
  RootInput:: getInstance("RunToTreat.txt");
  TChain* Chain = RootInput:: getInstance()->GetChain();
  // if input files are not given, use those from TAsciiFile
  if (myOptionManager->IsDefault("DetectorConfiguration")) {
    string name = RootInput::getInstance()->DumpAsciiFile("DetectorConfiguration");
    myOptionManager->SetDetectorFile(name);
  }

  if (myOptionManager->IsDefault("EventGenerator")) {
    string name = RootInput::getInstance()->DumpAsciiFile("EventGenerator");
    myOptionManager->SetReactionFile(name);
  }

  // get input files from NPOptionManager
  string detectorfileName    = myOptionManager->GetDetectorFile();
  string OutputfileName      = myOptionManager->GetOutputFile();

  // Instantiate RootOutput
  RootOutput::getInstance("Analysis/"+OutputfileName, "ResultTree");
  // RootOutput::getInstance()->GetFile()->SetCompressionLevel(0);
  // Instantiate the detector using a file
  NPA::DetectorManager* myDetector = new DetectorManager();
  myDetector->ReadConfigurationFile(detectorfileName);
  // Attach new branch
  InitOutputBranch();
  InitInputBranch();

  //	Instantiate the Reaction
  NPL::Reaction*  myReaction = new Reaction ;
  myReaction	->	ReadConfigurationFile(myOptionManager->GetReactionFile());

  ////////////////////////////////////////////////////////
  // Get pointer to the different detector

  TMust2Physics* M2  = (TMust2Physics*) myDetector -> GetDetector("MUST2");
  GaspardTracker* GD = (GaspardTracker*)  myDetector -> GetDetector("GASPARD");

  double TargetThickness = 18*micrometer;
adrien-matta's avatar
adrien-matta committed
  // Beam Energy
  double OriginalBeamEnergy = 4.0* 74; // AMEV
    // intermediate variable
adrien-matta's avatar
adrien-matta committed
  TRandom3 Rand = TRandom3();
  int DetectorNumber = 0 ;
  double ThetaNormalTarget = 0 ;
  double ThetaM2Surface = 0; 
  double Si_E_M2 = 0 ;
  double CsI_E_M2 = 0 ; 
adrien-matta's avatar
adrien-matta committed
  double Energy = 0;
  double E_M2 = 0;
adrien-matta's avatar
adrien-matta committed
  double ThetaGDSurface = 0; 
  double X_GD = 0 ;
  double Y_GD = 0 ;
  double Z_GD = 0 ;
  double Si_E_GD = 0 ;
  double E_GD = 0;
  double Si_X_GD = 0;
  double Si_Y_GD = 0;
 
  TVector3 BeamImpact(0,0,0);

adrien-matta's avatar
adrien-matta committed
  // Get number of events to treat
  cout << endl << "///////// Starting Analysis ///////// "<< endl;
  int nentries = Chain->GetEntries();
  cout << " Number of Event to be treated : " << nentries << endl;
  clock_t begin = clock();
  clock_t end = begin;
  cout.precision(5);
  //////////////////////////////////////////////////////////////////////////////
  // main loop on entries //
  for (int i = 0 ; i < nentries; i++) {
    if (i%10000 == 0 && i!=0)  {
      end = clock();
      long double TimeElapsed = (long double) (end-begin) / CLOCKS_PER_SEC;
      double percent = (double)i/nentries;
      double TimeToWait = (TimeElapsed/percent) - TimeElapsed;       
      cout  << "                                                      "<< flush;
      cout  << "\r Progression:" 
        << percent*100 << " % \t | \t Remaining time : ~" 
        <<  TimeToWait <<"s |  Analysis Rate : "
        << (double) i/TimeElapsed << flush;
    }
    else if (i == nentries-1)  cout << "\r Progression:" << " 100% " <<endl;
    // Get the raw Data
    Chain -> GetEntry(i);
    // Clear previous Event
    myDetector->ClearEventPhysics();
    // Build the current event
    myDetector->BuildPhysicalEvent();
    // Reinitiate calculated variable
    ReInitValue();
    double XTarget = 0;
    double YTarget = 0;
    TVector3 BeamDirection = TVector3(0,0,1);
    double BeamEnergy = BeamCD2.Slow(OriginalBeamEnergy,Rand.Uniform(0,TargetThickness),0);
    myReaction->SetBeamEnergy(BeamEnergy);

      //////////////////////////// LOOP on MUST2 //////////////////
adrien-matta's avatar
adrien-matta committed
    for(unsigned int countMust2 = 0 ; countMust2 < M2->Si_E.size() ; countMust2++){
      /************************************************/
      //Part 0 : Get the usefull Data
      // MUST2
      int TelescopeNumber = M2->TelescopeNumber[countMust2];

      /************************************************/
      // Part 1 : Impact Angle
      ThetaM2Surface = 0;
      ThetaNormalTarget = 0;
      TVector3 HitDirection = M2 -> GetPositionOfInteraction(countMust2) - BeamImpact ;
      ThetaLab = HitDirection.Angle( BeamDirection );
      ThetaM2Surface = HitDirection.Angle(- M2 -> GetTelescopeNormal(countMust2) );
      ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ;
adrien-matta's avatar
adrien-matta committed

      /************************************************/

      /************************************************/
      // Part 2 : Impact Energy
      Energy = ELab = 0;
      Si_E_M2 = M2->Si_E[countMust2];
      CsI_E_M2= M2->CsI_E[countMust2];
      // if SiLi
      if(CsI_E_M2>0 ){
adrien-matta's avatar
adrien-matta committed
        // The energy in CsI is calculate form dE/dx Table because 
        Energy = CsI_E_M2;
        Energy = LightAl.EvaluateInitialEnergy( Energy ,0.4*micrometer , ThetaM2Surface); 
        Energy+=Si_E_M2;
adrien-matta's avatar
adrien-matta committed
      }

      else
        Energy = Si_E_M2;

      // Evaluate energy using the thickness 
      ELab = LightAl.EvaluateInitialEnergy( Energy ,0.4*micrometer , ThetaM2Surface); 
      // Target Correction
      ELab   = LightCD2.EvaluateInitialEnergy( ELab ,TargetThickness/2., ThetaNormalTarget);
      /************************************************/

      /************************************************/
      // Part 3 : Excitation Energy Calculation
      Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab );
      ThetaLab=ThetaLab/deg;
adrien-matta's avatar
adrien-matta committed
      /************************************************/

      /************************************************/
      // Part 4 : Theta CM Calculation
      ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , 0)/deg;
      /************************************************/
    }//end loop MUST2
    
    ////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    //////////////////////////// LOOP on GASPARD //////////////////
    if(GD->GetEnergyDeposit()>0){
      /************************************************/
      // Part 1 : Impact Angle
      ThetaGDSurface = 0;
      ThetaNormalTarget = 0;
      if(XTarget>-1000 && YTarget>-1000){
        TVector3 HitDirection = GD -> GetPositionOfInteraction() - BeamImpact ;
        ThetaLab = HitDirection.Angle( BeamDirection );

        ThetaGDSurface = HitDirection.Angle( TVector3(0,0,1) ) ;
        ThetaNormalTarget = HitDirection.Angle( TVector3(0,0,1) ) ;
      }

      else{
        BeamDirection = TVector3(-1000,-1000,-1000);
        ThetaGDSurface    = -1000  ;
        ThetaNormalTarget = -1000  ;
      }

      /************************************************/

      /************************************************/
      // Part 2 : Impact Energy
      Energy = ELab = 0;
      Energy = GD->GetEnergyDeposit();
      
      // Target Correction
      ELab   = LightCD2.EvaluateInitialEnergy( Energy ,TargetThickness/2., ThetaNormalTarget);
adrien-matta's avatar
adrien-matta committed
      /************************************************/

      /************************************************/
      // Part 3 : Excitation Energy Calculation
      Ex = myReaction -> ReconstructRelativistic( ELab , ThetaLab );
      
      /************************************************/
adrien-matta's avatar
adrien-matta committed

      /************************************************/
      // Part 4 : Theta CM Calculation
      ThetaCM  = myReaction -> EnergyLabToThetaCM( ELab , ThetaLab)/deg;
adrien-matta's avatar
adrien-matta committed
      /************************************************/
    }//end loop GASPARD

    if(ELab>0)
      RootOutput::getInstance()->GetTree()->Fill();
   }// loop over events

  cout << "A total of " << nentries << " event has been annalysed " << endl ;

  RootOutput::getInstance()->Destroy();
  RootInput::getInstance()->Destroy();
  NPOptionManager::getInstance()->Destroy();
  /////////////////////////////////////////////////////////////////////////////
  return 0 ;
}

////////////////////////////////////////////////////////////////////////////////
void InitOutputBranch() {
  RootOutput::getInstance()->GetTree()->Branch("Ex",&Ex,"Ex/D");
  RootOutput::getInstance()->GetTree()->Branch("ELab",&ELab,"ELab/D");
  RootOutput::getInstance()->GetTree()->Branch("ThetaLab",&ThetaLab,"ThetaLab/D");
  RootOutput::getInstance()->GetTree()->Branch("ThetaCM",&ThetaCM,"ThetaCM/D");
}

////////////////////////////////////////////////////////////////////////////////
void InitInputBranch(){
  RootInput:: getInstance()->GetChain()->SetBranchAddress("InitialConditions",&Init );
  RootInput:: getInstance()->GetChain()->SetBranchStatus("InitialConditions",true );
  RootInput:: getInstance()->GetChain()->SetBranchStatus("fIC_*",true );
}
////////////////////////////////////////////////////////////////////////////////     
void ReInitValue(){
  Ex = -1000 ;
  ELab = -1000;
  ThetaLab = -1000;
  ThetaCM = -1000;
}


////////////////////////////////////////////////////////////////////////////////