]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
some scripts renames to RichXXX.C
authorkir <kir@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Jan 2005 07:14:38 +0000 (07:14 +0000)
committerkir <kir@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 24 Jan 2005 07:14:38 +0000 (07:14 +0000)
RICH/RichConfig.C [new file with mode: 0644]
RICH/RichGeom.C [new file with mode: 0644]
RICH/RichMenu.C [new file with mode: 0644]

diff --git a/RICH/RichConfig.C b/RICH/RichConfig.C
new file mode 100644 (file)
index 0000000..d8279da
--- /dev/null
@@ -0,0 +1,424 @@
+class RichConfig
+{
+RQ_OBJECT()
+public:
+          RichConfig(const char*sFileName);
+         ~RichConfig()                    {Info("ctor","");fMainFM->Cleanup(); delete fMainFM;}
+//protected:
+  enum ERichVers  {kNoRich=-1,kNormalRich,kTestBeam,kTestRadio,kAerogel,kOnTop};
+  enum EGenTypes  {kProton15=100,kBox1,kGun7,kPythia7,kHijing,kHijingPara,kRichLib,kSignalHijing,kHijingPara2Proton};
+  
+  enum EDetectors {kPIPE=1,kITS,kTPC,kTRD,kTOF,kFRAME,kMAG,kCRT,kHALL,kPHOS,kSTART,kFMD,kABSO,kPMD,kDIPO,kEMCAL,kVZERO,kMUON,kZDC,kSHILD};
+  enum EProcesses {kDCAY=1,kPAIR,kCOMP,kPHOT,kPFIS,kDRAY,kANNI,kBREM,kMUNU,kCKOV,kHADR,kLOSS,kMULS,kRAYL,kALL};
+  
+  void    AddDetector(Int_t id)          {if(id==kTRD || id==kTOF) fDetBG->SetButton(kFRAME);}
+  void    RemoveDetector(Int_t id)       {if(id==kFRAME) {fDetBG->SetButton(kTRD,kFALSE);fDetBG->SetButton(kTOF,kFALSE);}}
+  
+  void    AddProcess(Int_t id)           {if(id==kALL) for(int i=1;i<=fProcBG->GetCount();i++) fProcBG->SetButton(i,kButtonDown);}
+  void    RemoveProcess(Int_t id)        {if(id==kALL) for(int i=1;i<=fProcBG->GetCount();i++) fProcBG->SetButton(i,kButtonUp);}
+  
+  Float_t Eta2Theta(Float_t arg)    const{return (180./TMath::Pi())*2.*TMath::ATan(TMath::Exp(-arg));}
+  void    CreateConfig();
+  void    CreateRichBatch();
+  void    Exit();
+     
+  TGMainFrame  *fMainFM;//main window poiter
+  TGComboBox   *fRichVerCombo;  TGButton *fRichDeclusterBC,*fRichSagBC,*fRichDebugBC,*fRichFeedbackBC;//RICH
+  TGButton     *fMagFldBC;                               //MAG
+  TGComboBox   *fGenTypeCombo,*fGenPartIdCombo,*fGenMinMomCombo,*fGenMaxMomCombo,*fGenChamberCombo; TGNumberEntry *fGenNprimEntry;//GEN
+  TGButtonGroup *fDetBG;       //DETECTORS
+  TGButtonGroup *fProcBG;      //PROCESSES
+  char         *fFileName;
+};//class RichConfig
+//__________________________________________________________________________________________________    
+RichConfig::RichConfig(const char *sFileName)
+{// creates configuration file  
+  fFileName=sFileName;
+// Create main frame       
+  fMainFM=new TGMainFrame(gClient->GetRoot(),500,400);
+//  fMain->Connect("CloseWindow()","RichConfig",this,"CloseWindow()");   
+  fMainFM->AddFrame(pHorFrame=new TGHorizontalFrame(fMainFM,100,200));
+//RICH
+  pHorFrame->AddFrame(pVerFrame=new TGVerticalFrame(pHorFrame,100,200));  
+  pVerFrame->AddFrame(pRichFG=new TGGroupFrame(pHorFrame,"RICH"));
+  pRichFG->AddFrame(fRichVerCombo=new TGComboBox(pRichFG,100));
+    fRichVerCombo->AddEntry("no RICH"      ,kNoRich);
+    fRichVerCombo->AddEntry("normal RICH"  ,kNormalRich);
+    fRichVerCombo->AddEntry("RICH on top"  ,kOnTop);
+    fRichVerCombo->AddEntry("test beam"    ,kTestBeam);
+    fRichVerCombo->AddEntry("radio source" ,kTestRadio);
+    fRichVerCombo->AddEntry("aerogel"      ,kAerogel);
+    fRichVerCombo->Select(kNormalRich);  fRichVerCombo->Resize(150,20);
+    pRichFG->AddFrame(fRichDeclusterBC=new TGCheckButton(pRichFG,"Declustering"));       fRichDeclusterBC->SetState(kButtonDown);
+    pRichFG->AddFrame(fRichSagBC      =new TGCheckButton(pRichFG,"Wire sagita?"));       fRichSagBC      ->SetState(kButtonDown);
+    pRichFG->AddFrame(fRichDebugBC    =new TGCheckButton(pRichFG,"Debug StepManager?"));
+    pRichFG->AddFrame(fRichFeedbackBC =new TGCheckButton(pRichFG,"Generate feedbacks?"));fRichFeedbackBC ->SetState(kButtonDown); 
+//Generator  
+  pVerFrame->AddFrame(pGenGrpFrm=new TGGroupFrame(pHorFrame,"Generator"));
+  pGenGrpFrm->AddFrame(fGenTypeCombo=new TGComboBox(pGenGrpFrm,100));
+  fGenTypeCombo->AddEntry("15 GeV proton to fixed pad",kProton15);  
+  fGenTypeCombo->AddEntry("box gun to single chamber",kBox1);  
+  fGenTypeCombo->AddEntry("gun to all chambers",kGun7);
+  fGenTypeCombo->AddEntry("7 guns+Pythia",kPythia7);
+  fGenTypeCombo->AddEntry("HIJING",kHijing);
+  fGenTypeCombo->AddEntry("parametrized HIJING",kHijingPara);
+  fGenTypeCombo->AddEntry("2 p+HIJING",kHijingPara2Proton);
+  fGenTypeCombo->AddEntry("Sr90 source",kSr90);
+  fGenTypeCombo->AddEntry("RICH lib",kRichLib);
+  fGenTypeCombo->AddEntry("RICH lib+HIJING",kSignalHijing);
+  fGenTypeCombo->Select(kHijingPara);
+  fGenTypeCombo->Resize(160,20);
+  
+  pGenGrpFrm->AddFrame(fGenPartIdCombo=new TGComboBox(pGenGrpFrm,100)); //PID for guns
+  fGenPartIdCombo->AddEntry("Pion+"     ,kPiPlus);
+  fGenPartIdCombo->AddEntry("Pion-"     ,kPiMinus);
+  fGenPartIdCombo->AddEntry("Kaon+"     ,kKPlus);
+  fGenPartIdCombo->AddEntry("Kaon-"     ,kKMinus);
+  fGenPartIdCombo->AddEntry("K0s"       ,kK0Short);    
+  fGenPartIdCombo->AddEntry("Proton"    ,kProton);
+  fGenPartIdCombo->AddEntry("ProtonBar" ,kProtonBar);
+  fGenPartIdCombo->AddEntry("Lambda"    ,kLambda0);
+  fGenPartIdCombo->AddEntry("LambdaBar" ,kLambda0Bar);
+  fGenPartIdCombo->Select(kProton);  fGenPartIdCombo->Resize(160,20);
+
+  pGenGrpFrm->AddFrame(fGenMinMomCombo=new TGComboBox(pGenGrpFrm,100)); //particle energy for guns
+  
+  for(Int_t i=5;i<=95;i+=5)
+    fGenMinMomCombo->AddEntry(Form("%3.1f GeV",0.1*i), i);
+  fGenMinMomCombo->Select(15);  fGenMinMomCombo->Resize(160,20);
+  
+  pGenGrpFrm->AddFrame(fGenMaxMomCombo=new TGComboBox(pGenGrpFrm,100)); //particle energy for guns
+  for(Int_t i=10;i<=95;i+=5)
+    fGenMaxMomCombo->AddEntry(Form("%3.1f GeV",0.1*i), i);
+  fGenMaxMomCombo->Select(40);  fGenMaxMomCombo->Resize(160,20);
+  
+  pGenGrpFrm->AddFrame(fGenChamberCombo=new TGComboBox(pGenGrpFrm,100)); //chamber number in case of gun1
+  for(int i=1;i<=7;i++) fGenChamberCombo->AddEntry(Form("Chamber %i",i),i);
+  fGenChamberCombo->Select(4); fGenChamberCombo->Resize(160,20);
+  
+  pGenGrpFrm->AddFrame(pGenNprimFrm=new TGGroupFrame(pGenGrpFrm,"Number of primaries"));//number of primiries in case of HIJING
+  pGenNprimFrm->AddFrame(fGenNprimEntry=new TGNumberEntry(pGenNprimFrm,500));
+  
+// Magnetic Field
+  pVerFrame->AddFrame(pFldGrpFrm=new TGGroupFrame(pHorFrame,"Magnetic Field"));
+  pFldGrpFrm->AddFrame(fMagFldBC=new TGCheckButton(pFldGrpFrm,"On/Off"));
+  fMagFldBC->SetState(kButtonDown);
+//Detectors
+  pHorFrame->AddFrame(fDetBG=new TGButtonGroup(pHorFrame,"Detectors"));
+  fDetBG->Connect("Pressed(Int_t)" ,"RichConfig",this,"AddDetector(Int_t)");
+  fDetBG->Connect("Released(Int_t)","RichConfig",this,"RemoveDetector(Int_t)");
+    new TGCheckButton(fDetBG,"PIPE"  ,kPIPE));         
+    new TGCheckButton(fDetBG,"ITS"   ,kITS));         
+    new TGCheckButton(fDetBG,"TPC"   ,kTPC));
+    new TGCheckButton(fDetBG,"TRD"   ,kTRD));
+    new TGCheckButton(fDetBG,"TOF"   ,kTOF));         
+    new TGCheckButton(fDetBG,"FRAME" ,kFRAME));         
+    new TGCheckButton(fDetBG,"MAG"   ,kMAG));         
+    new TGCheckButton(fDetBG,"CRT"   ,kCRT));         
+    new TGCheckButton(fDetBG,"HALL"  ,kHALL));         
+    new TGCheckButton(fDetBG,"PHOS"  ,kPHOS));         
+    new TGCheckButton(fDetBG,"START" ,kSTART));         
+    new TGCheckButton(fDetBG,"FMD"   ,kFMD));         
+    new TGCheckButton(fDetBG,"ABSO"  ,kABSO));         
+    new TGCheckButton(fDetBG,"PMD"   ,kPMD));         
+    new TGCheckButton(fDetBG,"DIPO"  ,kDIPO));         
+    new TGCheckButton(fDetBG,"EMCAL" ,kEMCAL));         
+    new TGCheckButton(fDetBG,"VZERO" ,kVZERO));         
+    new TGCheckButton(fDetBG,"MUON"  ,kMUON));         
+    new TGCheckButton(fDetBG,"ZDC"   ,kZDC));         
+    new TGCheckButton(fDetBG,"SHILD" ,kSHILD));         
+//Processes  
+  pHorFrame->AddFrame(fProcBG=new TGButtonGroup(pHorFrame,"Processes"));
+  fProcBG->Connect("Pressed(Int_t)" ,"RichConfig",this,"AddProcess(Int_t)");
+  fProcBG->Connect("Released(Int_t)","RichConfig",this,"RemoveProcess(Int_t)");
+    new TGCheckButton(fProcBG,"ALL  ON/OFF"                 ,kALL)) ;
+    new TGCheckButton(fProcBG,"DCAY Decay"                  ,kDCAY));  fProcBG->SetButton(kDCAY);       
+    new TGCheckButton(fProcBG,"PAIR Pair production"        ,kPAIR));  fProcBG->SetButton(kPAIR);       
+    new TGCheckButton(fProcBG,"COMP Compton"                ,kCOMP));  fProcBG->SetButton(kCOMP);
+    new TGCheckButton(fProcBG,"PHOT"                        ,kPHOT));  fProcBG->SetButton(kPHOT);
+    new TGCheckButton(fProcBG,"PFIS Photofission"           ,kPFIS));  
+    new TGCheckButton(fProcBG,"DRAY Delta electrons"        ,kDRAY));  
+    new TGCheckButton(fProcBG,"ANNI Annihilation"           ,kANNI));  fProcBG->SetButton(kANNI);       
+    new TGCheckButton(fProcBG,"BREM Bremstraslung"          ,kBREM));  fProcBG->SetButton(kBREM);       
+    new TGCheckButton(fProcBG,"MUNU Muon-Nuclear"           ,kMUNU));  fProcBG->SetButton(kMUNU);       
+    new TGCheckButton(fProcBG,"CKOV Cerenkovs"              ,kCKOV));  fProcBG->SetButton(kCKOV);       
+    new TGCheckButton(fProcBG,"HADR Hadronic interactions " ,kHADR));  fProcBG->SetButton(kHADR);       
+    new TGCheckButton(fProcBG,"LOSS Energy losses"          ,kLOSS));  fProcBG->SetButton(kLOSS);       
+    new TGCheckButton(fProcBG,"MULS Multiple scattering"    ,kMULS));  fProcBG->SetButton(kMULS);       
+    new TGCheckButton(fProcBG,"RAYL"                        ,kRAYL));  fProcBG->SetButton(kRAYL);       
+//File    
+  fMainFM->AddFrame(pFileHorFrm=new TGHorizontalFrame(fMainFM,100,200));
+  pFileHorFrm->AddFrame(pCreateB=new TGTextButton(pFileHorFrm,"Create"));
+  pCreateB->Connect("Clicked()","RichConfig",this,"Exit()");                                 
+  pFileHorFrm->AddFrame(new TGLabel(pFileHorFrm,Form(" config file as %s",fFileName)));  
+  
+  fMainFM->MapSubwindows();   
+  fMainFM->Layout();
+  fMainFM->SetWindowName("Create AliROOT scripts");
+  fMainFM->MapWindow();      
+}//KirCondig::ctor
+//__________________________________________________________________________________________________          
+void RichConfig::CreateConfig()
+{   
+  FILE *fp=fopen(fFileName,"w"); if(!fp){Info("CreateConfigFile","Cannot open output file:%sn",fFileName);return;}
+  
+  fprintf(fp,"void Config()\n");
+  fprintf(fp,"{\n");
+  fprintf(fp,"  ::Info(\"RICH private config\",\"Start\");\n\n"); 
+//Random
+  fprintf(fp,"  gRandom->SetSeed(123456);//put 0 to use system time\n\n");    
+//Geant  
+  fprintf(fp,"  gSystem->Load(\"libgeant321\");\n");
+  fprintf(fp,"  new TGeant3(\"C++ Interface to Geant3\");\n\n");
+//File
+  fprintf(fp,"  AliRunLoader *pAL=AliRunLoader::Open(\"galice.root\",AliConfig::GetDefaultEventFolderName(),\"recreate\");\n");    
+  fprintf(fp,"  pAL->SetCompressionLevel(2);\n");
+  fprintf(fp,"  pAL->SetNumberOfEventsPerFile(1000);\n");
+  fprintf(fp,"  gAlice->SetRunLoader(pAL);\n\n");
+//Decayer  
+  fprintf(fp,"  TVirtualMCDecayer *pDecayer=new AliDecayerPythia();\n");
+  fprintf(fp,"  pDecayer->SetForceDecay(kAll);\n"); 
+  fprintf(fp,"  pDecayer->Init();\n"); 
+  fprintf(fp,"  gMC->SetExternalDecayer(pDecayer);\n\n");
+//Physics
+  if(fProcBG->GetButton(kDCAY)->GetState()) fprintf(fp,"  gMC->SetProcess(\"DCAY\",1);");  else fprintf(fp,"  gMC->SetProcess(\"DCAY\",0);");
+  if(fProcBG->GetButton(kPAIR)->GetState()) fprintf(fp,"  gMC->SetProcess(\"PAIR\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"PAIR\",0);\n");
+  if(fProcBG->GetButton(kCOMP)->GetState()) fprintf(fp,"  gMC->SetProcess(\"COMP\",1);");  else fprintf(fp,"  gMC->SetProcess(\"COMP\",0);");
+  if(fProcBG->GetButton(kPHOT)->GetState()) fprintf(fp,"  gMC->SetProcess(\"PHOT\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"PHOT\",0);\n");
+  if(fProcBG->GetButton(kPFIS)->GetState()) fprintf(fp,"  gMC->SetProcess(\"PFIS\",1);");  else fprintf(fp,"  gMC->SetProcess(\"PFIS\",0);");
+  if(fProcBG->GetButton(kDRAY)->GetState()) fprintf(fp,"  gMC->SetProcess(\"DRAY\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"DRAY\",0);\n");
+  if(fProcBG->GetButton(kANNI)->GetState()) fprintf(fp,"  gMC->SetProcess(\"ANNI\",1);");  else fprintf(fp,"  gMC->SetProcess(\"ANNI\",0);");
+  if(fProcBG->GetButton(kBREM)->GetState()) fprintf(fp,"  gMC->SetProcess(\"BREM\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"BREM\",0);\n");
+  if(fProcBG->GetButton(kMUNU)->GetState()) fprintf(fp,"  gMC->SetProcess(\"MUNU\",1);");  else fprintf(fp,"  gMC->SetProcess(\"MUNU\",0);");
+  if(fProcBG->GetButton(kCKOV)->GetState()) fprintf(fp,"  gMC->SetProcess(\"CKOV\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"CKOV\",0);\n");
+  if(fProcBG->GetButton(kHADR)->GetState()) fprintf(fp,"  gMC->SetProcess(\"HADR\",1);");  else fprintf(fp,"  gMC->SetProcess(\"HADR\",0);");
+  if(fProcBG->GetButton(kLOSS)->GetState()) fprintf(fp,"  gMC->SetProcess(\"LOSS\",2);\n");else fprintf(fp,"  gMC->SetProcess(\"LOSS\",0);\n");
+  if(fProcBG->GetButton(kMULS)->GetState()) fprintf(fp,"  gMC->SetProcess(\"MULS\",1);");  else fprintf(fp,"  gMC->SetProcess(\"MULS\",0);");
+  if(fProcBG->GetButton(kRAYL)->GetState()) fprintf(fp,"  gMC->SetProcess(\"RAYL\",1);\n");else fprintf(fp,"  gMC->SetProcess(\"RAYL\",0);\n");
+  
+  fprintf(fp,"\n");  
+  fprintf(fp,"  gMC->SetCut(\"CUTGAM\",0.001); ");  fprintf(fp,"  gMC->SetCut(\"CUTELE\",0.001); ");
+  fprintf(fp,"  gMC->SetCut(\"CUTNEU\",0.001);\n"); fprintf(fp,"  gMC->SetCut(\"CUTHAD\",0.001); ");
+  fprintf(fp,"  gMC->SetCut(\"CUTMUO\",0.001); ");  fprintf(fp,"  gMC->SetCut(\"BCUTE\" ,0.001);\n");
+  fprintf(fp,"  gMC->SetCut(\"BCUTM\" ,0.001); ");  fprintf(fp,"  gMC->SetCut(\"DCUTE\" ,0.001); ");
+  fprintf(fp,"  gMC->SetCut(\"DCUTM\" ,0.001);\n"); fprintf(fp,"  gMC->SetCut(\"PPCUTM\",0.001); ");
+  fprintf(fp,"  gMC->SetCut(\"TOFMAX\",1e10);\n\n"); 
+//Field
+  if(fMagFldBC->GetState()==kButtonDown) fprintf(fp,"  gAlice->SetField();\n\n");else fprintf(fp,"  gAlice->SetField(0);\n\n");
+  fprintf(fp,"  pAL->CdGAFile();\n\n");                                 //????       
+//BODY-ALIC 
+  fprintf(fp,"  new AliBODY(\"BODY\",\"Alice envelop\");\n\n");
+//RICH
+  if(fRichVerCombo->GetSelected() != kNoRich){  
+    TString richStr="RICH "; 
+    if(fRichDeclusterBC->GetState()!=kButtonDown){richStr+="no declustering "  ; fprintf(fp,"  AliRICHParam::SetDeclustering(kFALSE);\n");}
+    if(fRichSagBC->GetState()      !=kButtonDown){richStr+="no sagita "        ; fprintf(fp,"  AliRICHParam::SetWireSag(kFALSE);\n")     ;}
+    switch(fRichVerCombo->GetSelected()){//RICH
+      case kOnTop:      richStr+="top position";fprintf(fp,"  AliRICHParam::SetAngleRot(0);\n")      ;break;   
+      case kAerogel:    richStr+="aerogel"     ;fprintf(fp,"  AliRICHParam::SetAerogel(kTRUE);\n") ;break;   
+      case kTestRadio:  richStr+="radioactive" ;fprintf(fp,"  AliRICHParam::SetRadioSrc(kTRUE);\n");
+                                                fprintf(fp,"  AliRICHParam::SetTestBeam(kTRUE);\n");break;   
+      case kTestBeam:   richStr+="test beam"   ;fprintf(fp,"  AliRICHParam::SetTestBeam(kTRUE);\n");break;   
+      case kNormalRich: richStr+="normal"      ;                                                    break;   
+    }
+    if(fRichDebugBC->GetState()    ==kButtonDown){
+      richStr+="+debug StepManager"; 
+      fprintf(fp,"  AliRICH *pRICH=new AliRICHv0(\"RICH\",\"%s\");\n\n",richStr.Data());
+    }else{
+      fprintf(fp,"  AliRICH *pRICH=new AliRICHv1(\"RICH\",\"%s\");\n\n",richStr.Data());
+    }
+  }//Rich not selected
+//Generator
+  switch(fGenTypeCombo->GetSelected()){
+    case kHijingPara: 
+      fprintf(fp,"  AliGenHIJINGpara *pGen=new AliGenHIJINGpara(%i);\n",(int)fGenNprimEntry->GetNumber());
+      fprintf(fp,"  pGen->SetMomentumRange(0,999); pGen->SetThetaRange(%f,%f); pGen->SetPhiRange(0,360);\n",Eta2Theta(8),Eta2Theta(-8));
+      fprintf(fp,"  pGen->SetOrigin(0,0,0);  pGen->SetSigma(0,0,0);\n");
+      fprintf(fp,"  pGen->Init();\n");
+    break;
+    case kBox1:     
+      fprintf(fp,"  AliGenBox *pGen=new AliGenBox(1);\n");  
+      fprintf(fp,"  pGen->SetPart(%i); pGen->SetOrigin(0,0,0);\n",fGenPartIdCombo->GetSelected());  
+      fprintf(fp,"  pGen->SetMomentumRange(%3.1f,%3.1f); \n",float(fGenMinMomCombo->GetSelected())/10,   float(fGenMaxMomCombo->GetSelected())/10);
+      fprintf(fp,"  pGen->SetThetaRange(pRICH->C(%i)->ThetaD()-3,pRICH->C(%i)->ThetaD()-1); \n",fGenChamberCombo->GetSelected(),fGenChamberCombo->GetSelected());
+      fprintf(fp,"  pGen->SetPhiRange(pRICH->C(%i)->PhiD()-1,pRICH->C(%i)->PhiD()+1); \n",fGenChamberCombo->GetSelected(),fGenChamberCombo->GetSelected());    
+      fprintf(fp,"  pGen->Init();\n");
+    break;    
+    case kProton15:   
+      fprintf(fp,"  AliGenFixed *pFixed=new AliGenFixed(1);\n");
+      fprintf(fp,"  pFixed->SetPart(kProton); pFixed->SetOrigin(0,0,0);\n");
+      fprintf(fp,"  pFixed->SetMomentum(15);  pFixed->SetTheta(113.37); pFixed->SetPhi(9.73);\n");                             
+      fprintf(fp,"  pFixed->Init();\n");
+    break;
+    case kGun7:   
+      fprintf(fp,"  AliGenCocktail *pCocktail=new AliGenCocktail();\n");
+      fprintf(fp,"  for(int i=1;i<=7;i++){\n");
+      fprintf(fp,"    AliGenFixed *pFixed=new AliGenFixed(1);\n");
+      fprintf(fp,"    pFixed->SetPart(%i); pFixed->SetMomentum(1.0+i*0.5); pFixed->SetOrigin(0,0,0);\n",fGenPartIdCombo->GetSelected());
+      fprintf(fp,"    pFixed->SetPhi(pRICH->C(i)->PhiD()); pFixed->SetTheta(pRICH->C(i)->ThetaD()-2);\n");                             
+      fprintf(fp,"    pCocktail->AddGenerator(pFixed,Form(\"Fixed %i\",i),1);\n  }\n");  
+      fprintf(fp,"  pCocktail->Init();\n");
+    break;
+    case kPythia7:      
+      fprintf(fp,"  AliGenCocktail *pCocktail=new AliGenCocktail();\n");
+      fprintf(fp,"  for(int i=1;i<=7;i++){\n");
+      fprintf(fp,"    AliGenFixed *pFixed=new AliGenFixed(1);\n");
+      fprintf(fp,"    pFixed->SetPart(%i); pFixed->SetMomentum(2.5+i*0.4); pFixed->SetOrigin(0,0,0);\n",fGenPartIdCombo->GetSelected());
+      fprintf(fp,"    pFixed->SetPhiRange(pRICH->C(i)->PhiD()); pFixed->SetThetaRange(pRICH->C(i)->ThetaD()-2);\n");                             
+      fprintf(fp,"    pCocktail->AddGenerator(pFixed,Form(\"Fixed %i\",i),1);\n  }\n");  
+      fprintf(fp,"  AliGenPythia *pPythia = new AliGenPythia(-1);\n");
+      fprintf(fp,"  pPythia->SetMomentumRange(0,999999); pPythia->SetPhiRange(20,80); pPythia->SetThetaRange(75,115);\n");
+      fprintf(fp,"  pPythia->SetYRange(-12,12);  pPythia->SetPtRange(0,1000);  pPythia->SetStrucFunc(kCTEQ4L);\n");
+      fprintf(fp,"  pPythia->SetProcess(kPyMb);  pPythia->SetEnergyCMS(14000);\n");      
+      fprintf(fp,"  pCocktail->AddGenerator(pPythia,\"Pythia\",1);\n");  
+      fprintf(fp,"  pCocktail->Init();\n");
+    case kSr90:  
+      fprintf(fp,"  AliGenRadioactive *pGen=new AliGenRadioactive(kSr90,%i);\n",(int)fGenNprimEntry->GetNumber());
+      fprintf(fp,"  pGen->SetOrigin(0,0,0);  pGen->SetSigma(0.1,0.1,0.05);\n");      
+      fprintf(fp,"  pGen->Init();\n");
+    break;  
+    case kHijing:  
+      fprintf(fp,"  AliGenHijing *pGen=new AliGenHijing(-1); pGen->SetEnergyCMS(5500); pGen->SetReferenceFrame(\"CMS\");\n");
+      fprintf(fp,"  pGen->SetProjectile(\"A\", 208, 82); pGen->SetTarget(\"A\", 208, 82);\n");      
+      fprintf(fp,"  pGen->SetJetQuenching(0); pGen->SetShadowing(0);\n");
+      fprintf(fp,"  pGen->KeepFullEvent(); pGen->SetSelectAll(0); \n");
+      fprintf(fp,"  pGen->SetImpactParameterRange(0., 5.);\n");
+      fprintf(fp,"  pGen->Init();\n");
+    break;  
+    case kHijingPara2Proton:  
+      fprintf(fp,"  AliGenCocktail *pCocktail=new AliGenCocktail();\n");
+      fprintf(fp,"  for(int i=1;i<=7;i++){\n");
+      fprintf(fp,"    AliGenFixed *pProton1=new AliGenFixed(1);\n");
+      fprintf(fp,"    AliGenFixed *pProton2=new AliGenFixed(1);\n");
+      fprintf(fp,"    pProton1->SetPart(kProton); pProton1->SetMomentum(2.0+i*0.5); pProton1->SetOrigin(0,0,0);\n");
+      fprintf(fp,"    pProton2->SetPart(kProton); pProton2->SetMomentum(2.0+i*0.5); pProton2->SetOrigin(0,0,0);\n");
+      fprintf(fp,"    pProton1->SetPhiRange(pRICH->C(i)->PhiD()); pProton1->SetThetaRange(pRICH->C(i)->ThetaD());\n");                             
+      fprintf(fp,"    pProton2->SetPhiRange(pRICH->C(i)->PhiD()); pProton2->SetThetaRange(pRICH->C(i)->ThetaD()-4);\n");                             
+      fprintf(fp,"    pCocktail->AddGenerator(pProton1,Form(\"proton1 %i\",i),1);\n");  
+      fprintf(fp,"    pCocktail->AddGenerator(pProton2,Form(\"proton2 %i\",i),1);\n  }\n");  
+      
+      fprintf(fp,"  AliGenHIJINGpara *pHijingPara=new AliGenHIJINGpara(510);\n");
+      fprintf(fp,"  pHijingPara->SetMomentumRange(0,99); pHijingPara->SetThetaRange(60,120); pHijingPara->SetPhiRange(0,60);\n");
+      fprintf(fp,"  pHijingPara->SetOrigin(0,0,0);  pHijingPara->SetSigma(0,0,0);\n");
+      fprintf(fp,"  pCocktail->AddGenerator(pHijingPara,\"HijingPara\",1);\n");  
+      fprintf(fp,"  pCocktail->Init();\n");
+    break;  
+     case kRichLib:
+      fprintf(fp,"  AliGenParam *pGen=new AliGenParam(2,new AliGenRICHlib,%i,\"EXP\"); \n",fGenPartIdCombo->GetSelected());
+      fprintf(fp,"  pGen->SetPtRange(%3.1f,%3.1f); \n",fGenMinMomCombo->GetSelected()/10,fGenMaxMomCombo->GetSelected()/10);
+      fprintf(fp,"  pGen->SetYRange(-0.6,0.6); \n");
+      fprintf(fp,"  pGen->SetPhiRange(0.,60.); \n");
+      fprintf(fp,"  pGen->SetForceDecay(kAll); \n");
+      fprintf(fp,"  pGen->Init();\n");
+    break;
+   case kSignalHijing:
+      fprintf(fp,"  AliGenParam *pRichLib=new AliGenParam(2,new AliGenRICHlib,%i,\"FLAT\"); \n",fGenPartIdCombo->GetSelected());
+      fprintf(fp,"  pRichLib->SetPtRange(%3.1f,%3.1f); \n",fGenMinMomCombo->GetSelected()/10,fGenMaxMomCombo->GetSelected()/10);
+      fprintf(fp,"  pRichLib->SetYRange(-0.6,0.6); \n");
+      fprintf(fp,"  pRichLib->SetPhiRange(0.,60.); \n");
+      fprintf(fp,"  pRichLib->SetForceDecay(kPhiKK); \n");
+
+      fprintf(fp,"  AliGenHijing *pHijing=new AliGenHijing(-1); pHijing->SetEnergyCMS(5500); pHijing->SetReferenceFrame(\"CMS\");\n");
+      fprintf(fp,"  pHijing->SetProjectile(\"A\", 208, 82); pHijing->SetTarget(\"A\", 208, 82);\n");
+      fprintf(fp,"  pHijing->SetJetQuenching(0); pHijing->SetShadowing(0);\n");
+      fprintf(fp,"  pHijing->KeepFullEvent(); pHijing->SetSelectAll(0); \n");
+      fprintf(fp,"  pHijing->SetImpactParameterRange(0., 5.);\n");
+
+      fprintf(fp,"  AliGenCocktail *pCocktail=new AliGenCocktail();\n");
+      fprintf(fp,"  pCocktail->AddGenerator(pRichLib,\"RichLib\",1);\n");
+      fprintf(fp,"  pCocktail->AddGenerator(pHijing,\"Hijing\",1);\n");
+      fprintf(fp,"  pCocktail->Init();\n");
+    break;
+  }
+//central before RICH detectors                  
+  if(fDetBG->GetButton(kPIPE )->GetState()) fprintf(fp,"\n  new AliPIPEv0(\"PIPE\",\"Beam Pipe\");\n");
+  if(fDetBG->GetButton(kSHILD)->GetState()) fprintf(fp,"\n  new AliSHILv2(\"SHIL\",\"Shielding Version 2\");\n");  
+  if(fDetBG->GetButton(kITS  )->GetState()){
+    fprintf(fp,"\n  AliITSvPPRasymmFMD *pIts =new AliITSvPPRasymmFMD(\"ITS\",\"ITS PPR detailed version\");\n");
+    fprintf(fp,"  pIts->SetMinorVersion(2); pIts->SetReadDet(kTRUE);\n");
+    fprintf(fp,"  pIts->SetThicknessDet1(200.); pIts->SetThicknessDet2(200.);\n");
+    fprintf(fp,"  pIts->SetThicknessChip1(200.); pIts->SetThicknessChip2(200.);\n");
+    fprintf(fp,"  pIts->SetRails(0); pIts->SetCoolingFluid(1);\n");
+    fprintf(fp,"  pIts->SetEUCLID(0);\n");
+  }  
+  if(fDetBG->GetButton(kTPC  )->GetState()) {fprintf(fp,"\n  AliTPC *pTpc=new AliTPCv2(\"TPC\",\"Default\"); pTpc->SetSecAU(-1);pTpc->SetSecAL(-1);\n");}  
+  if(fDetBG->GetButton(kFRAME)->GetState())  fprintf(fp,"\n  AliFRAMEv2 *pFrame=new AliFRAMEv2(\"FRAME\",\"Space Frame\"); pFrame->SetHoles(1);\n");
+  if(fDetBG->GetButton(kTRD  )->GetState()) {
+    fprintf(fp,"\n  AliTRD *pTrd=new AliTRDv1(\"TRD\",\"TRD slow simulator\");\n");
+    fprintf(fp,"  pTrd->SetGasMix(1); pTrd->SetPHOShole(); pTrd->SetRICHhole();pTrd->CreateTR();\n");
+  }  
+  if(fDetBG->GetButton(kTOF  )->GetState()) fprintf(fp,"\n  new AliTOFv4T0(\"TOF\", \"normal TOF\");\n");
+//central after RICH detectors  
+  if(fDetBG->GetButton(kMAG  )->GetState()) fprintf(fp,"\n  new AliMAG(\"MAG\",\"Magnet\");\n");  
+  if(fDetBG->GetButton(kHALL )->GetState()) fprintf(fp,"\n  new AliHALL(\"HALL\",\"Alice Hall\");\n");
+//forward detectors  
+  if(fDetBG->GetButton(kFMD  )->GetState()) fprintf(fp,"\n  new AliFMDv1(\"FMD\",\"normal FMD\");\n");
+  if(fDetBG->GetButton(kABSO )->GetState()) fprintf(fp,"\n  new AliABSOv0(\"ABSO\",\"Muon absorber\");\n");
+  if(fDetBG->GetButton(kDIPO )->GetState()) fprintf(fp,"\n  new AliDIPOv2(\"DIPO\",\"Dipole version 2\");\n");
+  if(fDetBG->GetButton(kMUON )->GetState()) fprintf(fp,"\n  new AliMUONv1(\"MUON\",\"default\");\n");
+  if(fDetBG->GetButton(kPMD  )->GetState()) fprintf(fp,"\n  new AliPMDv1(\"PMD\",\"normal PMD\");\n");
+  if(fDetBG->GetButton(kSTART)->GetState()) fprintf(fp,"\n  new AliSTARTv1(\"START\",\"START Detector\");\n");
+  if(fDetBG->GetButton(kVZERO)->GetState()) fprintf(fp,"\n  new AliVZEROv2(\"VZERO\",\"normal VZERO\");\n");
+  if(fDetBG->GetButton(kZDC  )->GetState()) fprintf(fp,"\n  new AliZDCv2(\"ZDC\",\"normal ZDC\");\n");
+//different phase space detectors  
+  if(fDetBG->GetButton(kPHOS )->GetState()) fprintf(fp,"\n  new AliPHOSv1(\"PHOS\",\"IHEP\");\n");
+  if(fDetBG->GetButton(kEMCAL)->GetState()) fprintf(fp,"\n  new AliEMCALv1(\"EMCAL\",\"G56_2_55_19_104_14\");\n");
+  if(fDetBG->GetButton(kCRT  )->GetState()) fprintf(fp,"\n  new AliCRTv0(\"CRT\",\"normal ACORDE\");\n");
+
+  fprintf(fp,"\n  ::Info(\"RICH private config\",\"Stop\");\n"); 
+  fprintf(fp,"}\n");
+out:  
+  fclose(fp);  
+//  fMain->CloseWindow();
+}//CreateConfig
+//__________________________________________________________________________________________________
+void RichConfig::CreateRichBatch()
+{//creates RichBatch.C file
+  FILE *fp=fopen("RichBatch.C","w"); if(!fp){Info("CreateRichBatch","Cannot open output file: RichBatch.C");return;}
+  
+  fprintf(fp,"void RichBatch(const Int_t iNevents,const Bool_t isDebug,const char *sConfigFileName)\n");
+  fprintf(fp,"{\n");
+  fprintf(fp,"  gSystem->Exec(\"rm -rf *.root hlt hough fort* ZZZ*\");\n");
+  fprintf(fp,"  if(isDebug)   AliLog::SetGlobalDebugLevel(AliLog::kDebug);\n");
+  fprintf(fp,"  TStopwatch sw;TDatime time;\n\n");
+  
+  fprintf(fp,"  AliSimulation     *pSim=new AliSimulation(sConfigFileName);\n");
+  if(fGenTypeCombo->GetSelected()==kBox1||fGenTypeCombo->GetSelected()==kGun7) {
+    fprintf(fp,"  pSim->SetRegionOfInterest(kTRUE);\n");
+    fprintf(fp,"  pSim->SetMakeSDigits(\"TOF RICH\");\n");
+    fprintf(fp,"  pSim->SetMakeDigitsFromHits(\"ITS TPC TRD\");\n");
+  }
+  fprintf(fp,"  pSim->Run(iNevents); delete pSim;\n\n");
+  if(fRichVerCombo->GetSelected()==kNormalRich){
+    fprintf(fp,"  AliReconstruction *pRec=new AliReconstruction;\n");
+    fprintf(fp,"  pRec->SetRunLocalReconstruction(\"ITS TPC TRD TOF RICH\");\n");
+    fprintf(fp,"  pRec->SetFillESD(\"ITS TPC TRD TOF RICH\");\n");
+    fprintf(fp,"  pRec->Run();         delete pRec;\n\n");
+  }
+  
+  fprintf(fp,"  cout<<\"!!!!!!!!!!!!Info in <my/RichBatch.C>: Start time: \";time.Print();\n");
+  fprintf(fp,"  cout<<\"!!!!!!!!!!!!Info in <my/RichBatch.C>: Stop  time: \";time.Set();  time.Print();\n");
+  fprintf(fp,"  cout<<\"!!!!!!!!!!!!Info in <my/RichBatch.C>: Time  used: \";sw.Print();\n\n");
+  
+  fprintf(fp,"  gSystem->Exec(\"touch ZZZ______finished_______ZZZ\");\n");
+  fprintf(fp,"  gSystem->Exec(\"playwave ~/bin/end.wav\");\n");
+  fprintf(fp,"}\n");
+  
+  fclose(fp);  
+}//CreateRichBatch()
+//__________________________________________________________________________________________________
+void RichConfig::Exit()
+{
+//slot to be invoked by clik on the Create button  
+  CreateConfig();
+  CreateRichBatch();
+//  fMainFM->SendCloseMessage();
+}
+//__________________________________________________________________________________________________
+RichConfig *rc;
+void RichConfig()
+{
+   rc=new RichConfig("Config.C");
+}   
+
diff --git a/RICH/RichGeom.C b/RICH/RichGeom.C
new file mode 100644 (file)
index 0000000..b07f980
--- /dev/null
@@ -0,0 +1,242 @@
+TGeoManager  *g=0;
+AliRICHParam *p=0;
+Int_t copy; //volume copy number 
+Double_t dx,dy,dz,r1,r2;//tmp vars for volume dimentions
+Double_t cm=1,m=100*cm,mm=0.1*cm,mkm=0.001*cm;//length units  
+
+void Geom()
+{
+  AliRICHParam::SetRadioSrc(kTRUE);
+  p=new AliRICHParam;
+  
+  //gSystem->Load("libGeom.so");  
+  g=new TGeoManager("GEL","Aerogel test configuration");
+  Materials();  
+  TGeoVolume *pMother=g->MakeBox("Mother",g->GetMedium("Air"),dx=30*m/2,dy=30*m/2,dz=30*m/2); //arbitrary values  
+  g->SetTopVolume(g->GetVolume("Mother"));
+    
+  Rich(pMother);
+  
+  Colors();  
+  g->CloseGeometry();
+  
+  g->SetVisOption(0); g->SetVisLevel(5); 
+  
+  g->GetMasterVolume()->Draw();
+  Axis();
+//  gPad->GetView()->SetView(3,94,-70,0);
+  new TBrowser;
+}
+//__________________________________________________________________________________________________
+void Aerogel()
+{
+  
+  TGeoVolume *pGel     =g->MakeBox("RGEL" ,g->GetMedium("Air"),dx=10*cm/2,dy= 10*cm/2 ,dz=10*cm/2);//10x10x10 cm aerogel cubic
+  for(int i=1;i<=7;i++)//put 7 cubics
+    g->GetVolume("Mother")->AddNode(pGel,copy=i,new TGeoCombiTrans(p->C(i)->Center().X(), p->C(i)->Center().Y(), p->C(i)->Center().Z(),
+                                                new TGeoRotation(Form("GelRot%i",i),p->C(i)->ThetaXd(),p->C(i)->PhiXd(),
+                                                                                    p->C(i)->ThetaYd(),p->C(i)->PhiYd(),
+                                                                                    p->C(i)->ThetaZd(),p->C(i)->PhiZd())));
+
+}
+//__________________________________________________________________________________________________
+void Materials()
+{
+// Defines all the materials and tracking media
+  Double_t a=0,z=0,den=0,radlen=0,intlen=0;//tmp vars for material parameters
+  new TGeoMaterial("Air"      ,a=26.98 ,z=13,den=0.4224                             );        new TGeoMedium("Air"      ,1,g->GetMaterial("Air")); 
+  new TGeoMaterial("CH4"      ,a=26.98 ,z=13,den=0.4224                             ); pCH4  =new TGeoMedium("CH4"      ,2,g->GetMaterial("CH4"));
+  new TGeoMaterial("CsI"      ,a=26.98 ,z=13,den=2.7 ,radlen=24.01*cm,intlen=70.6*cm); pCsI  =new TGeoMedium("CsI"      ,3,g->GetMaterial("CsI"));
+  new TGeoMaterial("Al"       ,a=26.98 ,z=13,den=2.7 ,radlen=24.01*cm,intlen=70.6*cm); pAl   =new TGeoMedium("Al"       ,4,g->GetMaterial("Al")); 
+  new TGeoMaterial("W"        ,a=183.84,z=27,den=19.3,radlen= 9.59*cm,intlen=0.35*cm); pW    =new TGeoMedium("W"        ,5,g->GetMaterial("W"));
+  new TGeoMaterial("Cu"       ,a=55.845,z=26,den=7.87,radlen=13.84*cm,intlen=82.8*cm); pCu   =new TGeoMedium("Cu"       ,6,g->GetMaterial("Cu"));
+  new TGeoMaterial("Rohacell" ,a=12.01 ,z=6 ,den=0.1 ,radlen=18.8,intlen=0);           pRoha =new TGeoMedium("Rohacell" ,7,g->GetMaterial("Rohacell"));
+  new TGeoMaterial("SiO2"     ,a=0     ,z=0 ,den=0);                                   pSiO2 =new TGeoMedium("SiO2"     ,8,g->GetMaterial("SiO2"));
+  new TGeoMaterial("C6F14"    ,a=0     ,z=0 ,den=0);                                   pC6F14=new TGeoMedium("C6F14"    ,9,g->GetMaterial("C6F14"));
+//Medium for Sr90 source  
+  new TGeoMaterial("Perpex"  ,a=55.845,z=26,den=7.87,radlen=13.84*cm,intlen=82.8*cm); pPerpex=new TGeoMedium("Perpex"  ,10,g->GetMaterial("Perpex"));
+  new TGeoMaterial("Steel"   ,a=55.845,z=26,den=7.87,radlen=13.84*cm,intlen=82.8*cm); pSteel =new TGeoMedium("Steel"   ,11,g->GetMaterial("Steel"));
+  new TGeoMaterial("Mylar"   ,a=55.845,z=26,den=7.87,radlen=13.84*cm,intlen=82.8*cm); pMylar =new TGeoMedium("Mylar"   ,12,g->GetMaterial("Mylar"));
+  new TGeoMaterial("Sr90"    ,a=87.62 ,z=38,den=7.87,radlen=13.84*cm,intlen=82.8*cm); pSr    =new TGeoMedium("Sr90"    ,13,g->GetMaterial("Sr90"));
+}//Materials()
+//__________________________________________________________________________________________________
+void Rich(TGeoVolume *pTop)
+{
+//Rich  
+  TGeoVolume *pRich=g->MakeBox( "Rich"     ,g->GetMedium("CH4"),dx=(6*mm+1681*mm+6*mm)/2,  //main RICH volume
+                                                                dy=(6*mm+1466*mm+6*mm)/2,
+                                                                dz=(80*mm+40*mm)*2/2);     //x,y taken from 2033P1  z from p84 TDR  
+  for(int i=1;i<=p->Nchambers();i++)//put 7 chambers
+    pTop->AddNode(pRich,copy=i,new TGeoCombiTrans(p->C(i)->Center().X(), p->C(i)->Center().Y(), p->C(i)->Center().Z(),
+                                                 new TGeoRotation(Form("RichRot%i",i),p->C(i)->ThetaXd(),p->C(i)->PhiXd(),
+                                                                                      p->C(i)->ThetaYd(),p->C(i)->PhiYd(),
+                                                                                      p->C(i)->ThetaZd(),p->C(i)->PhiZd()))); //Rich to Mother    
+  
+                 PadPanelFrame(pRich); //photocathode
+                 Gap(pRich);           //anod wires
+                 Frame3(pRich);        //cathode wires
+                 Frame4(pRich);        //collection wires  
+  if(!p->IsRadioSrc())    Radiators(pRich);
+  else                    Sr90(pRich);
+                 Sandbox(pRich);
+}//Rich()
+//__________________________________________________________________________________________________
+void PadPanelFrame(TGeoVolume *pTop)
+{
+//Pad Panel frame  
+  TGeoVolume *pPpf     =g->MakeBox("PPF"      ,g->GetMedium("Al")  ,dx=648*mm/2,dy=  411*mm/2 ,dz=40  *mm/2);//PPF 2001P2 inner size of the slab by 1mm more
+  TGeoVolume *pPpfLarge=g->MakeBox("PPFlarge" ,g->GetMedium("Air") ,dx=181*mm/2,dy=89.25*mm/2 ,dz=38.3*mm/2);//large whole
+  TGeoVolume *pPpfSmall=g->MakeBox("PPFsmall" ,g->GetMedium("Air") ,dx=114*mm/2,dy=89.25*mm/2 ,dz=38.3*mm/2);//small whole
+  TGeoVolume *pPc      =g->MakeBox("PC"       ,g->GetMedium("CsI") ,dx=644*mm/2,dy=  407*mm/2 ,dz= 1.7*mm/2);//by 0.2 mm more then actual size (PCB 2006P1)
+  
+  pTop->AddNode(pPpf,copy=1,new TGeoTranslation(-335*mm,-433*mm,8*cm+20*mm));//F1 2040P1 z p.84 TDR
+  pTop->AddNode(pPpf,copy=2,new TGeoTranslation(+335*mm,-433*mm,8*cm+20*mm));
+  pTop->AddNode(pPpf,copy=3,new TGeoTranslation(-335*mm,   0*mm,8*cm+20*mm));
+  pTop->AddNode(pPpf,copy=4,new TGeoTranslation(+335*mm,   0*mm,8*cm+20*mm));
+  pTop->AddNode(pPpf,copy=5,new TGeoTranslation(-335*mm,+433*mm,8*cm+20*mm));
+  pTop->AddNode(pPpf,copy=6,new TGeoTranslation(+335*mm,+433*mm,8*cm+20*mm));
+  pPpf->AddNode( pPc ,copy=1,new TGeoTranslation(   0*mm,   0*mm,-19.15*mm));//PPF 2001P2 
+  pPpf->AddNode(pPpfLarge,copy=1,new TGeoTranslation(-224.5*mm,-151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=2,new TGeoTranslation(-224.5*mm,- 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=3,new TGeoTranslation(-224.5*mm,+ 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=4,new TGeoTranslation(-224.5*mm,+151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=1,new TGeoTranslation(- 65.0*mm,-151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=2,new TGeoTranslation(- 65.0*mm,- 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=3,new TGeoTranslation(- 65.0*mm,+ 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=4,new TGeoTranslation(- 65.0*mm,+151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=5,new TGeoTranslation(+ 65.0*mm,-151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=6,new TGeoTranslation(+ 65.0*mm,- 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=7,new TGeoTranslation(+ 65.0*mm,+ 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfSmall,copy=8,new TGeoTranslation(+ 65.0*mm,+151.875*mm,  0.85*mm)); 
+  pPpf->AddNode(pPpfLarge,copy=5,new TGeoTranslation(+224.5*mm,-151.875*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=6,new TGeoTranslation(+224.5*mm,- 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=7,new TGeoTranslation(+224.5*mm,+ 50.625*mm,  0.85*mm));
+  pPpf->AddNode(pPpfLarge,copy=8,new TGeoTranslation(+224.5*mm,+151.875*mm,  0.85*mm));
+}//PadPanelFrame()
+//__________________________________________________________________________________________________
+void Gap(TGeoVolume *pTop)
+{
+//Gap - anod wires
+  TGeoVolume *pGap =g->MakeBox ("Gap"  ,g->GetMedium("CH4") ,dx=648*mm/2,dy=  411*mm/2 ,dz=4.45*mm/2);//xy as PPF 2001P2 z WP 2099P1
+  TGeoVolume *pAnod=g->MakeTube("Anod" ,g->GetMedium("W")   ,r1=  0*mm  ,r2=  20*mkm/2 ,dz=648*mm/2);  //WP 2099P1 z = gap x PPF 2001P2
+  TGeoRotation *pAnodRot=new TGeoRotation("AnodRot",90,90,0);
+  
+  pTop->AddNode(pGap,copy=1,new TGeoTranslation(-335*mm,-433*mm,8*cm-2.225*mm)); //F1 2040P1 z WP 2099P1
+  pTop->AddNode(pGap,copy=2,new TGeoTranslation(+335*mm,-433*mm,8*cm-2.225*mm)); 
+  pTop->AddNode(pGap,copy=3,new TGeoTranslation(-335*mm,   0*mm,8*cm-2.225*mm)); 
+  pTop->AddNode(pGap,copy=4,new TGeoTranslation(+335*mm,   0*mm,8*cm-2.225*mm)); 
+  pTop->AddNode(pGap,copy=5,new TGeoTranslation(-335*mm,+433*mm,8*cm-2.225*mm)); 
+  pTop->AddNode(pGap,copy=6,new TGeoTranslation(+335*mm,+433*mm,8*cm-2.225*mm)); 
+  for(int i=1;i<=96;i++)
+    pGap->AddNode(pAnod,copy=i,new TGeoCombiTrans( 0*mm, -411/2*mm+i*4*mm, 0.185*mm,pAnodRot)); //WP 2099P1  
+}//Gap()
+//__________________________________________________________________________________________________
+void Frame3(TGeoVolume *pTop)
+{//Frame 3- cathode wires      
+  TGeoVolume *pCath=g->MakeTube("Cath"  ,g->GetMedium("Cu")  ,r1=0  ,r2=100*mkm/2,dz=1323*mm/2);//r WP 2099P1 z F3 2041P1       
+  TGeoRotation *pCathRot=new TGeoRotation("CathRot",90,90,0);
+  for(int i=1;i<=618;i++)
+    pTop->AddNode(pCath,copy=i,new TGeoCombiTrans( 0*mm, -649.5*mm+i*2.1*mm, 75*mm,pCathRot)); //WP 2099P1    
+}//Frame3()
+//__________________________________________________________________________________________________
+void Frame4(TGeoVolume *pTop)
+{
+//Frame 4- collection wires
+  TGeoVolume *pF4  =g->MakeBox( "F4"       ,g->GetMedium("CH4")   ,dx=1407*mm/2 ,dy=1366*mm/2  ,dz=  15*mm/2);//F4 2043P1 
+  TGeoVolume *pF4al=g->MakeBox( "F4al"     ,g->GetMedium("Al")    ,dx=1407*mm/2 ,dy=1366*mm/2  ,dz=  10*mm/2); 
+  TGeoVolume *pF4in=g->MakeBox( "F4in"     ,g->GetMedium("CH4")   ,dx=1323*mm/2 ,dy=1296*mm/2  ,dz=  10*mm/2); 
+  TGeoVolume *pColl=g->MakeTube("Coll"     ,g->GetMedium("Cu")    ,r1=   0*mm   ,r2=100*mkm/2  ,dz=1323*mm/2);
+  TGeoRotation *pCollRot=new TGeoRotation("CollRot",90,90,0);
+  
+  pTop->AddNode(pF4      ,copy=1,new TGeoTranslation(   0*mm,0*mm,   9*mm)); //F4 to Rich p.84 TDR
+    pF4  ->AddNode(pF4al    ,copy=1,new TGeoTranslation(   0*mm,0*mm, 2.5*mm)); //F4 al to F4 2043P1 
+    pF4al->AddNode(pF4in    ,copy=1,new TGeoTranslation(   0*mm,0*mm,   0*mm)); //F4 whole F4 al 2043P1   
+    for(int i=1;i<=322;i++)
+      pF4->AddNode(pColl,copy=i,new TGeoCombiTrans( 0*mm, -1296/2*mm+i*4*mm, -5*mm,pCollRot)); //F4 2043P1
+}//void Frame4()
+//__________________________________________________________________________________________________
+void Radiators(TGeoVolume *pTop)
+{
+  TGeoVolume *pRad      =g->MakeBox( "Rad"      ,g->GetMedium("C6F14")    ,dx=1330*mm/2 ,dy= 413*mm/2  ,dz=  24*mm/2); // Rad 2011P1
+  TGeoVolume *pRadFront =g->MakeBox( "RadFront" ,g->GetMedium("Neoceram") ,dx=1330*mm/2 ,dy= 413*mm/2  ,dz=   4*mm/2); 
+  TGeoVolume *pRadWin   =g->MakeBox( "RadWin"   ,g->GetMedium("SiO2")     ,dx=1330*mm/2 ,dy= 413*mm/2  ,dz=   5*mm/2); 
+  TGeoVolume *pRadLong  =g->MakeBox( "RadLong"  ,g->GetMedium("Neoceram") ,dx=1330*mm/2 ,dy=   5*mm/2  ,dz=  15*mm/2);    
+  TGeoVolume *pRadShort =g->MakeBox( "RadShort" ,g->GetMedium("Neoceram") ,dx=  10*mm/2 ,dy= 403*mm/2  ,dz=  15*mm/2);    
+  TGeoVolume *pRadSpacer=g->MakeTube("RadSpacer",g->GetMedium("SiO2")     ,r1= 0        ,r2=10*mm/2  ,dz=  15*mm/2);         
+    
+  pTop->AddNode(pRad      ,copy=1,new TGeoTranslation(   0*mm,-434*mm,   -12*mm)); 
+  pTop->AddNode(pRad      ,copy=2,new TGeoTranslation(   0*mm,   0*mm,   -12*mm)); 
+  pTop->AddNode(pRad      ,copy=3,new TGeoTranslation(   0*mm,+434*mm,   -12*mm)); 
+    
+  pRad ->AddNode(pRadFront ,copy=1,new TGeoTranslation(   0*mm,   0*mm, -10.0*mm));
+  pRad ->AddNode(pRadWin   ,copy=1,new TGeoTranslation(   0*mm,   0*mm,   9.5*mm));
+  pRad ->AddNode(pRadLong  ,copy=1,new TGeoTranslation(   0*mm,-204*mm,  -0.5*mm));
+  pRad ->AddNode(pRadLong  ,copy=2,new TGeoTranslation(   0*mm,+204*mm,  -0.5*mm));
+  pRad ->AddNode(pRadShort ,copy=1,new TGeoTranslation(-660*mm,   0*mm,  -0.5*mm));
+  pRad ->AddNode(pRadShort ,copy=2,new TGeoTranslation(+660*mm,   0*mm,  -0.5*mm));
+  for(int i=0;i<3;i++)
+    for(int j=0;j<10;j++)
+      pRad->AddNode(pRadSpacer,copy=10*i+j,new TGeoTranslation(-1330*mm/2+116*mm+j*122*mm,(i-1)*105*mm,-0.5*mm));
+}//Radiators()  
+//__________________________________________________________________________________________________
+void Sr90(TGeoVolume *pTop)
+{
+    pSrc               =g->MakeTube("Src"              ,g->GetMedium("CH4")   , 0 , 70*mm/2 ,  30*mm/2);       //top container
+      pAlGlass         =g->MakeTube("SrcAlGlass"       ,g->GetMedium("Al")    , 0 , 38*mm/2 ,21.8*mm/2);       //Al glass wall        
+        pPerpexPlug    =g->MakeTube("SrcPerpex"        ,g->GetMedium("Perpex"), 0 , 34*mm/2 ,  20*mm/2);       //Perpex plug         
+          pScrewCentral=g->MakeTube("SrcScrewCentral"  ,g->GetMedium("Steel") , 0 ,  5*mm/2 ,  15*mm/2);       //Steel screw in the center        
+          pScrewSr90   =g->MakeTube("SrcScrewSr90"     ,g->GetMedium("Steel") , 0 ,  2*mm/2 ,  10*mm/2);       //Steel screw to support Sr90 
+            pSr90      =g->MakeTube("SrcSr90"          ,g->GetMedium("Sr90")  , 0 ,  1*mm/2 ,   1*mm/2);       //Sr90 source
+          pHolePerpex  =g->MakeTube("SrcHolePerpex"    ,g->GetMedium("Air")   , 0 ,  4*mm/2 ,  10*mm/2);       //Air hole in perpex plug      
+        pHoleAl        =g->MakeTube("SrcHoleAl"        ,g->GetMedium("Air")   , 0 ,  5*mm/2 , 1.8*mm/2);       //Air hole in Al glass bottom
+    pMylarFoil         =g->MakeTube("SrcMylarFoil"     ,g->GetMedium("Mylar") , 0 , 30*mm/2 , 50*mkm/2);       //Mylar foil                
+                
+    pTop->AddNode(pSrc,1,new TGeoTranslation(30*cm,0,1*cm));
+      pSrc ->AddNode(pMylarFoil,1,new TGeoTranslation(0,0,21.8*mm/2+50*mkm/2));
+      pSrc ->AddNode(pAlGlass,1,new TGeoTranslation(0,0,0));                           //Al glass to fake Src volume
+        pAlGlass->AddNode(       pHoleAl      ,1,new TGeoTranslation(6*mm,0, -10*mm));
+        pAlGlass->AddNode(       pPerpexPlug  ,1,new TGeoTranslation(0*mm,0, 0.9*mm));
+          pPerpexPlug->AddNode(  pHolePerpex  ,1,new TGeoTranslation(6*mm,0,  -5*mm));      
+          pPerpexPlug->AddNode(  pScrewCentral,1,new TGeoTranslation(0   ,0, 2.5*mm));  
+          pPerpexPlug->AddNode(  pScrewSr90   ,1,new TGeoTranslation(6*mm,0,   5*mm));  
+            pScrewSr90->AddNode( pSr90        ,1,new TGeoTranslation(0   ,0,-4.5*mm));  
+}//Sr90()    
+//__________________________________________________________________________________________________
+void Sandbox(TGeoVolume *pTop)
+{//Sandbox  
+  TGeoVolume *pSandBox  =g->MakeBox( "SandBox"  ,g->GetMedium("Air")  ,dx=1419*mm/2 ,dy=1378*mm/2   ,dz=50.5*mm/2);  //2072P1   
+  TGeoVolume *pSandCover=g->MakeBox( "SandCover",g->GetMedium("Al")   ,dx=1419*mm/2 ,dy=1378*mm/2   ,dz= 0.5*mm/2);  
+  TGeoVolume *pSandComb =g->MakeBox( "SandComb" ,g->GetMedium("Roha") ,dx=1359*mm/2 ,dy=1318*mm/2   ,dz=49.5*mm/2);  
+  
+  pTop->AddNode(pSandBox,copy=1,new TGeoTranslation(  0*mm,0*mm, -73.75*mm)); //p.84 TDR
+    pSandBox->AddNode(pSandComb  ,copy=1,new TGeoTranslation(  0*mm,0*mm,      0*mm)); //2072P1
+    pSandBox->AddNode(pSandCover ,copy=1,new TGeoTranslation(  0*mm,0*mm,    +25*mm)); 
+    pSandBox->AddNode(pSandCover ,copy=2,new TGeoTranslation(  0*mm,0*mm,    -25*mm)); 
+}//Sandbox()
+//__________________________________________________________________________________________________
+void Axis()
+{
+// Draw axises  on top of geometry    
+  Double_t X[6]={0,0,0,300,0,0};  Double_t Y[6]={0,0,0,0,300,0};  Double_t Z[6]={0,0,0,0,0,300};  
+  TPolyLine3D *pXaxis=new TPolyLine3D(2,X);pXaxis->SetLineColor(kRed);   pXaxis->Draw();
+  TPolyLine3D *pYaxis=new TPolyLine3D(2,Y);pYaxis->SetLineColor(kGreen); pYaxis->Draw();
+  TPolyLine3D *pZaxis=new TPolyLine3D(2,Z);pZaxis->SetLineColor(kBlue);  pZaxis->Draw();  
+}
+//__________________________________________________________________________________________________
+void Colors()
+{
+//Set volume colors  
+  TGeoVolume *pVol=0;
+  pVol=g->GetVolume("Pc")       ; if(pVol) pVol->SetLineColor(kGreen);
+  pVol=g->GetVolume("PPFlarge") ; if(pVol) pVol->SetLineColor(kYellow);
+  pVol=g->GetVolume("PPFsmall") ; if(pVol) pVol->SetLineColor(kYellow);
+  pVol=g->GetVolume("RadFront") ; if(pVol) pVol->SetLineColor(kRed);
+  pVol=g->GetVolume("RadLong")  ; if(pVol) pVol->SetLineColor(46);
+  pVol=g->GetVolume("RadShort") ; if(pVol) pVol->SetLineColor(kMagenta);
+  pVol=g->GetVolume("RadWin")   ; if(pVol) pVol->SetLineColor(kBlue);
+  pVol=g->GetVolume("RadSpacer"); if(pVol) pVol->SetLineColor(kYellow);
+  pVol=g->GetVolume("SrcSr90")       ; if(pVol) pVol->SetLineColor(kRed);
+  pVol=g->GetVolume("SrcScrewSr90")  ; if(pVol) pVol->SetLineColor(kGreen);
+  pVol=g->GetVolume("SrcHolePerpex") ; if(pVol) pVol->SetLineColor(26);
+  pVol=g->GetVolume("SrcHoleAl")     ; if(pVol) pVol->SetLineColor(27);
+}
diff --git a/RICH/RichMenu.C b/RICH/RichMenu.C
new file mode 100644 (file)
index 0000000..a9619e6
--- /dev/null
@@ -0,0 +1,271 @@
+//globals for easy manual manipulations
+AliRun *a;       
+AliRunLoader *al;
+AliLoader *rl;
+AliRICH *r;
+AliStack *s;
+
+void ph(Int_t event=0)  {r->PrintHits(event);}    //utility print hits for 'event' event
+void ps(Int_t event=0)  {r->PrintSDigits(event);} //utility print sdigits
+void pd(Int_t event=0)  {r->PrintDigits(event);}  //utility print digits
+void pc(Int_t event=0)  {r->PrintClusters(event);}//utility print clusters
+void pt(Int_t event=0)  {r->PrintTracks(event);}  //utility print tracks
+Int_t ne(Int_t event=0)   {AliRICH::Nparticles(kElectron,event,al);} //utility number of electrons
+Int_t npi0(Int_t event=0) {AliRICH::Nparticles(kPi0,event,al);}      //utility number of electrons
+Int_t npip(Int_t event=0) {AliRICH::Nparticles(kPiPlus,event,al);}   //utility number of electrons
+Int_t npim(Int_t event=0) {AliRICH::Nparticles(kPiMinus,event,al);}  //utility number of electrons
+Int_t nk0(Int_t event=0)  {AliRICH::Nparticles(kK0,event,al);}       //utility number of electrons
+Int_t nkp(Int_t event=0)  {AliRICH::Nparticles(kKPlus,event,al);}    //utility number of electrons
+Int_t nkm(Int_t event=0)  {AliRICH::Nparticles(kKMinus,event,al);}   //utility number of electrons
+Int_t npp(Int_t event=0)  {AliRICH::Nparticles(kProton,event,al);}   //utility number of protons
+//__________________________________________________________________________________________________
+void pp(int tid)
+{
+  if(!al) return;
+  al->LoadHeader();  al->LoadKinematics();
+  
+  if(tid<0||tid>=al->Stack()->GetNtrack())
+    cout<<"Valid tid number is 0-"<<al->Stack()->GetNtrack()-1<<" for this event.\n";
+  else
+    PrintParticleInfo(tid);
+  
+  al->UnloadKinematics();  al->UnloadHeader();
+}
+//__________________________________________________________________________________________________
+void PrintParticleInfo(int tid)
+{
+// Prints particle info for a given TID
+  TParticle *p=al->Stack()->Particle(tid);
+  cout<<p->GetName()<<"("<<tid<<")";
+  if(p->GetMother(0)!=-1){cout<<" from "; PrintParticleInfo(p->GetMother(0));}
+  else                   {cout<<endl;} 
+}    
+//__________________________________________________________________________________________________
+Int_t prim(Int_t tid)
+{
+// Provides mother TID for the given TID
+  al->LoadHeader();  al->LoadKinematics();
+  
+  if(tid<0||tid>=al->Stack()->GetNtrack())
+    cout<<"Valid tid number is 0-"<<al->Stack()->GetNtrack()-1<<" for this event.\n";
+  else
+    while(1){
+      TParticle *p=al->Stack()->Particle(tid);
+      if(p->GetMother(0)==-1) break;
+      tid=p->GetMother(0);
+    }
+  
+  al->UnloadKinematics();  al->UnloadHeader();
+  return tid;
+}
+
+//__________________________________________________________________________________________________
+void Show()
+{  
+  CreateHists();
+  Info("","\n\n\n");
+//load all trees  
+  al->LoadHeader(); 
+    al->LoadKinematics();  
+      Bool_t isHits=!rl->LoadHits();  
+        Bool_t isSdigits=!rl->LoadSDigits();  
+          Bool_t isDigits=!rl->LoadDigits();//loaders
+            Bool_t isClusters=!rl->LoadRecPoints();
+  
+  for(Int_t iEventN=0;iEventN<a->GetEventsPerRun();iEventN++){//events loop
+    Int_t iNparticles=al->Stack()->GetNtrack();
+    Int_t iNprims=al->Stack()->GetNprimary();
+    
+    Int_t iKPlusCounter=0,iKMinusCounter=0;    
+    for(Int_t iParticleN=0;iParticleN<iNparticles;iParticleN++){//stack loop
+      TParticle *pPart=al->Stack()->Particle(iParticleN);
+      switch(pPart->GetPdgCode()){
+        case kKPlus: iKPlusCounter++; break;
+        case kKMinus:iKMinusCounter++; break;
+      }
+    }//stack loop
+    
+    Info("Show-STA","Evt %i->   %i particles %i primaries  %i K+ %i K-",
+                     iEventN,   iNparticles,    iNprims,      iKPlusCounter,         iKMinusCounter);
+    
+    Int_t iHitsCounter=0;
+    Int_t iNentries=rl->TreeH()->GetEntries();
+    for(Int_t iEntryN=0;iEntryN<iNentries;iEntryN++){//TreeH loop
+      rl->TreeH()->GetEntry(iEntryN);//get current entry (prim)          
+      
+      for(Int_t iHitN=0;iHitN<r->Hits()->GetEntries();iHitN++){//hits loop
+        iHitsCounter++;
+        AliRICHhit *pHit = (AliRICHhit*)r->Hits()->At(iHitN);//get current hit
+        TParticle *pPart=al->Stack()->Particle(pHit->GetTrack());//get stack particle which produced the current hit
+        FillContribs(pPart->GetPdgCode(),pHit->C(),kFALSE);
+      }//hits loop
+      
+      if(iEntryN<7) Info("Show","Evt %i-> prim %4i has %4i hits from %s (,%7.2f,%7.2f)",
+                  iEventN,iEntryN, r->Hits()->GetEntries(), pPart->GetName(), pPart->Theta()*TMath::RadToDeg(),pPart->Phi()*TMath::RadToDeg());
+    }//TreeH loop
+    Info("Show-HIT","Evt %i->   %i particles %i primaries  %i entries in TreeH %i hits",
+                     iEventN,   iNparticles,    iNprims,      iNentries,         iHitsCounter);
+    
+    if(isSdigits){
+      rl->TreeS()->GetEntry(0);
+      Info("Show-SDI","Evt %i contains %5i sdigits",iEventN,r->SDigits()->GetEntries());
+    }
+    if(isDigits){
+      rl->TreeD()->GetEntry(0);
+      for(int i=1;i<=7;i++)
+        Info("Show-DIG","Evt %i chamber %i contains %5i digits",
+                                 iEventN,   i,           r->Digits(i)->GetEntries());
+    }else
+        Info("Show-DIG","There is no digits for this event");
+    if(isClusters){
+      rl->TreeR()->GetEntry(0);
+      for(int i=1;i<=7;i++)
+        Info("Show-CLU","Evt %i chamber %i contains %5i clusters",
+                                 iEventN,   i,           r->Clusters(i)->GetEntries());
+    }
+    cout<<endl;
+  }//events loop
+//unload all trees    
+  rl->UnloadHits();  
+    if(isSdigits) rl->UnloadSDigits(); 
+      if(isDigits) rl->UnloadDigits(); 
+        if(isClusters) rl->UnloadRecPoints();
+          al->UnloadHeader();
+            al->UnloadKinematics();
+  ShowHists();            
+}//void Show()
+//__________________________________________________________________________________________________
+
+
+
+Bool_t ReadAlice()
+{
+  Info("ReadAlice","Tring to read ALICE from SIMULATED FILE.");
+  if(gAlice){
+    delete gAlice->GetRunLoader();
+    delete gAlice;
+  }      
+  if(!(al=AliRunLoader::Open())){//if not possible to read from galice.root, then create the new session
+    gSystem->Exec("rm -rf *.root *.dat");
+    Error("menu.C::ReadAlice","galice.root broken, removing all this garbage then init new one");
+    new AliRun("gAlice","Alice experiment system");
+    AliLog::SetModuleDebugLevel("RICH",1);
+    gAlice->Init("Config.C");
+    r=(AliRICH*)gAlice->GetDetector("RICH");
+    a=gAlice; //for manual convinience
+    return kFALSE;
+  }
+  al->LoadgAlice();//before this gAlice is 0;
+  if(!gAlice) Fatal("menu.C::ReadAlice","No gAlice in file");
+  a=al->GetAliRun();//provides pointer to AliRun object
+//RICH      
+  if(!(r=(AliRICH*)gAlice->GetDetector("RICH"))) Warning("RICH/menu.C::ReadAlice","No RICH in file");
+  if(!(rl=al->GetLoader("RICHLoader")))          Warning("RICH/menu.C::ReadAlice","No RICH loader in file");        
+        
+  Info("ReadAlice","Run contains %i event(s)",gAlice->GetEventsPerRun());      
+  return kTRUE;
+}
+//__________________________________________________________________________________________________
+void TestMenu()
+{
+  TControlBar *pMenu = new TControlBar("vertical","RICH test");
+  pMenu->AddButton("Test segmentation"  ,"rp->TestSeg()"  ,"Test AliRICHParam segmentation methods");
+  pMenu->AddButton("Test response"      ,"rp->TestResp()" ,"Test AliRICHParam response methods");
+  pMenu->AddButton("Test transformation","rp->TestTrans()","Test AliRICHParam transformation methods");
+  pMenu->AddButton("Test opticals"      ,".x Opticals.h"  ,"Test optical properties");
+  pMenu->Show();  
+}//TestMenu()
+//__________________________________________________________________________________________________
+void RichMenu()
+{ 
+  TControlBar *pMenu = new TControlBar("vertical","RICH main");
+       
+  if(ReadAlice()){//it's from file, show some info
+    pMenu->AddButton("Show",            "Show()",             "Shows the structure of events in files");
+    pMenu->AddButton("Display Fast",    "AliRICHDisplFast *d = new AliRICHDisplFast(); d->Exec();",        "Display Fast");
+    pMenu->AddButton("Control Plots",   "ControlPlots()",     "Create some control histograms");
+    
+  }else{//it's aliroot, simulate
+    pMenu->AddButton("Debug ON",     "DebugON();",   "Switch debug on-off");   
+    pMenu->AddButton("Debug OFF",    "DebugOFF();",   "Switch debug on-off");   
+    pMenu->AddButton("Run",         "a->Run(1)",       "Process!");
+    pMenu->AddButton("Geo GUI",     "GeomGui()",       "Shows geometry"); 
+    pMenu->AddButton("Read RAW",    "ReadRaw()",       "Read a list of digits from test beam file"); 
+  }
+  pMenu->AddButton("Test submenu",    "TestMenu()",            "Shows test submenu");
+  pMenu->AddButton("Browser",         "new TBrowser;",         "Start ROOT TBrowser");
+  pMenu->AddButton("Quit",            ".q",                    "Close session");
+  pMenu->Show();
+}//menu()
+//__________________________________________________________________________________________________
+void DebugOFF(){  Info("DebugOFF","");  AliLog::SetGlobalDebugLevel(0);}
+void DebugON() {  Info("DebugON","");   AliLog::SetGlobalDebugLevel(AliLog::kDebug);}
+//__________________________________________________________________________________________________
+TObjArray * CreateHists(Double_t pcut=0.9)
+{
+  TH2F *pPosH2    =new TH2F("pos"   ,"Pos mixture",5,0,5, 9,0,9); pPosH2->SetStats(0);
+  TH2F *pNegH2    =new TH2F("neg"   ,"Neg mixture",5,0,5, 9,0,9); pNegH2->SetStats(0);
+  TH2F *pPosCutH2 =new TH2F("poscut",Form("Pos mixture with P>%4.2f GeV",pcut),5,0,5, 9,0,9); pPosCutH2->SetStats(0);
+  TH2F *pNegCutH2 =new TH2F("negcut",Form("Neg mixture with P>%4.2f GeV",pcut),5,0,5, 9,0,9); pNegCutH2->SetStats(0);
+  pPosH2->GetXaxis()->SetBinLabel(1,"e^{+}");        pNegH2->GetXaxis()->SetBinLabel(1,"e^{-}");  
+  pPosH2->GetXaxis()->SetBinLabel(2,"#mu^{+}");      pNegH2->GetXaxis()->SetBinLabel(2,"#mu^{-}");
+  pPosH2->GetXaxis()->SetBinLabel(3,"#pi^{+}");      pNegH2->GetXaxis()->SetBinLabel(3,"#pi^{-}");
+  pPosH2->GetXaxis()->SetBinLabel(4,"K^{+}");        pNegH2->GetXaxis()->SetBinLabel(4,"K^{-}");  
+  pPosH2->GetXaxis()->SetBinLabel(5,"p^{+}");        pNegH2->GetXaxis()->SetBinLabel(5,"p^{-}");  
+  
+  pPosCutH2->GetXaxis()->SetBinLabel(1,"e^{+}");     pNegCutH2->GetXaxis()->SetBinLabel(1,"e^{-}");  
+  pPosCutH2->GetXaxis()->SetBinLabel(2,"#mu^{+}");   pNegCutH2->GetXaxis()->SetBinLabel(2,"#mu^{-}");
+  pPosCutH2->GetXaxis()->SetBinLabel(3,"#pi^{+}");   pNegCutH2->GetXaxis()->SetBinLabel(3,"#pi^{-}");
+  pPosCutH2->GetXaxis()->SetBinLabel(4,"K^{+}");     pNegCutH2->GetXaxis()->SetBinLabel(4,"K^{-}");  
+  pPosCutH2->GetXaxis()->SetBinLabel(5,"p^{+}");     pNegCutH2->GetXaxis()->SetBinLabel(5,"p^{-}");  
+  
+  pPosH2->GetYaxis()->SetBinLabel(1,"ch1");          pNegH2->GetYaxis()->SetBinLabel(1,"ch1");  
+  pPosH2->GetYaxis()->SetBinLabel(2,"ch2");          pNegH2->GetYaxis()->SetBinLabel(2,"ch2");  
+  pPosH2->GetYaxis()->SetBinLabel(3,"ch3");          pNegH2->GetYaxis()->SetBinLabel(3,"ch3");  
+  pPosH2->GetYaxis()->SetBinLabel(4,"ch4");          pNegH2->GetYaxis()->SetBinLabel(4,"ch4");  
+  pPosH2->GetYaxis()->SetBinLabel(5,"ch5");          pNegH2->GetYaxis()->SetBinLabel(5,"ch5");  
+  pPosH2->GetYaxis()->SetBinLabel(6,"ch6");          pNegH2->GetYaxis()->SetBinLabel(6,"ch6");  
+  pPosH2->GetYaxis()->SetBinLabel(7,"ch7");          pNegH2->GetYaxis()->SetBinLabel(7,"ch7");  
+  pPosH2->GetYaxis()->SetBinLabel(8,"prim");         pNegH2->GetYaxis()->SetBinLabel(8,"prim");  
+  pPosH2->GetYaxis()->SetBinLabel(9,"tot");          pNegH2->GetYaxis()->SetBinLabel(9,"tot");  
+
+  pPosCutH2->GetYaxis()->SetBinLabel(1,"ch1");          pNegCutH2->GetYaxis()->SetBinLabel(1,"ch1");  
+  pPosCutH2->GetYaxis()->SetBinLabel(2,"ch2");          pNegCutH2->GetYaxis()->SetBinLabel(2,"ch2");  
+  pPosCutH2->GetYaxis()->SetBinLabel(3,"ch3");          pNegCutH2->GetYaxis()->SetBinLabel(3,"ch3");  
+  pPosCutH2->GetYaxis()->SetBinLabel(4,"ch4");          pNegCutH2->GetYaxis()->SetBinLabel(4,"ch4");  
+  pPosCutH2->GetYaxis()->SetBinLabel(5,"ch5");          pNegCutH2->GetYaxis()->SetBinLabel(5,"ch5");  
+  pPosCutH2->GetYaxis()->SetBinLabel(6,"ch6");          pNegCutH2->GetYaxis()->SetBinLabel(6,"ch6");  
+  pPosCutH2->GetYaxis()->SetBinLabel(7,"ch7");          pNegCutH2->GetYaxis()->SetBinLabel(7,"ch7");  
+  pPosCutH2->GetYaxis()->SetBinLabel(8,"prim");         pNegCutH2->GetYaxis()->SetBinLabel(8,"prim");  
+  pPosCutH2->GetYaxis()->SetBinLabel(9,"tot");          pNegCutH2->GetYaxis()->SetBinLabel(9,"tot");  
+  TObjArray *pOA=new TObjArray;
+  pOA->Add(pPosH2);pOA->Add(pNegH2);pOA->Add(pPosCutH2);pOA->Add(pNegCutH2);  
+  return pOA;
+}//ParticleContribs()
+//__________________________________________________________________________________________________
+
+void ShowHists()
+{
+  pC=new TCanvas("c1","Particle composition");
+  pC->Divide(2,2);
+  pC->cd(1);  pos->Draw("text"); gPad->SetGrid();
+  pC->cd(2);  neg->Draw("text"); gPad->SetGrid();
+  pC->cd(3);  poscut->Draw("text"); gPad->SetGrid();
+  pC->cd(4);  negcut->Draw("text"); gPad->SetGrid();
+}
+
+//__________________________________________________________________________________________________
+void GeomGui()
+{
+  if(gGeoManager){ 
+    gGeoManager->GetTopVolume()->Draw(); 
+    AliRICHParam::ShowAxis();
+  }else 
+    new G3GeometryGUI;
+}  
+//__________________________________________________________________________________________________
+void ControlPlots()
+{
+  r->ControlPlots();
+  new TBrowser;
+}