//*-- AUTHOR : J. Markert
//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////////
// HMdcGarMacroMaker
// Class to create a GARFIELD Macro for Batch farm processing to simulate
// a couple of tracks for each sample point (distance from wire). The produced
// signals on the sense wire will be written to an ascii file, which can be read in
// via HMdcGarSignalReader afterwards.
// As input you have to specify the Mdc (0-3) and the angle (0-85 degree)
// where 0 degree is perpendicular impact of the track.
////////////////////////////////////////////////////////////////////////////
using namespace std;
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include "hmdcgarmacromaker.h"
#include "TString.h"
#include "TObjString.h"
ClassImp(HMdcGarMacroMaker)
Float_t HMdcGarMacroMaker::cathodth [4]={0.01 ,0.01 ,0.01 ,0.01 };
Float_t HMdcGarMacroMaker::senseth [4]={0.002,0.002,0.002,0.002};
Float_t HMdcGarMacroMaker::fieldth [4]={0.01 ,0.01 ,0.01 ,0.01 };
Float_t HMdcGarMacroMaker::cathodpitch[4]={0.2,0.2,0.3,0.4};
Float_t HMdcGarMacroMaker::sensepitch [4]={0.5,0.6,1.2,1.4};
Float_t HMdcGarMacroMaker::fieldpitch [4]={0.5,0.6,1.2,1.4};
Int_t HMdcGarMacroMaker::cathodhv [4]={-1750,-1800,-2000,-2400};
Int_t HMdcGarMacroMaker::sensehv [4]={ 0, 0, 0, 0};
Int_t HMdcGarMacroMaker::fieldhv [4]={-1750,-1800,-2000,-2400};
Int_t HMdcGarMacroMaker::cathodhvmod [4]={0,0,0,0};
Int_t HMdcGarMacroMaker::sensehvmod [4]={0,0,0,0};
Int_t HMdcGarMacroMaker::fieldhvmod [4]={0,0,0,0};
Int_t HMdcGarMacroMaker::ncathod [4]={10,10,13,13};
Int_t HMdcGarMacroMaker::nsense [4]={3 ,3 ,3 ,3 };
Int_t HMdcGarMacroMaker::nfield [4]={4 ,4 ,4 ,4 };
Float_t HMdcGarMacroMaker::dc_s [4]={0.25,0.26,0.4,0.5};
Float_t HMdcGarMacroMaker::cathodx [4]={0.9 ,0.9 ,1.8 ,2.4};
Float_t HMdcGarMacroMaker::sensex [4]={0.5 ,0.6 ,1.2 ,1.4};
Float_t HMdcGarMacroMaker::fieldx [4]={0.75,0.9 ,1.8 ,2.1};
Float_t HMdcGarMacroMaker::area [4][4]={{-0.30,-0.30, 0.30, 0.30},
{-0.30,-0.30, 0.30, 0.30},
{-0.91,-0.41, 0.91, 0.41},
{-0.81,-0.52, 0.81, 0.52}};
Int_t HMdcGarMacroMaker::cwire [4]={43,43,52,52};
Int_t HMdcGarMacroMaker::cwire_foil [4]={6,6,6,6};
Float_t HMdcGarMacroMaker::time_up [4]={0.3,0.3,0.5,0.5};
Float_t HMdcGarMacroMaker::time_low [4]={0.0,0.0,0.0,0.0};
Float_t HMdcGarMacroMaker::B_components[3]={0.0 ,0.0 ,0.0};
/*
Int_t HMdcGarMacroMaker::maxLoop[4][18]={{25,26,26,26,27,28,29,31,33,36,33,31,29,28,27,26,26,26},
{30,31,31,32,32,32,35,37,40,37,34,32,31,29,28,27,27,27},
{60,61,61,63,64,67,70,70,63,57,53,49,47,45,43,42,41,41},
{70,71,72,73,75,78,81,86,78,71,66,62,58,56,54,52,51,51}};
Int_t HMdcGarMacroMaker::minLoop[4][18]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
*/
Int_t HMdcGarMacroMaker::minLoop[4][18]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
Int_t HMdcGarMacroMaker::maxLoop[4][18]={{25,28,29,31,33,34,35,35,36,36,36,35,35,34,33,31,29,28},
{30,33,35,36,38,39,39,40,40,40,40,39,38,37,35,33,31,29},
{60,64,67,69,71,72,72,73,72,71,70,68,65,62,59,55,50,46},
{70,75,78,81,83,85,86,87,86,85,84,82,79,75,71,67,62,56 }};
HMdcGarMacroMaker::HMdcGarMacroMaker(const char* name,const char* title)
: TNamed(name,title)
{
// constructor for HMdcGarMacroMaker
// The parameters are initialized with non valid values.
initVariables();
}
HMdcGarMacroMaker::~HMdcGarMacroMaker()
{
// destructor of HMdcGarMacroMaker
}
void HMdcGarMacroMaker::setArgon(Int_t ar)
{
if (helium > 0)
{
Error("HMdcGarMacroMaker:setArgon()","ADMIXTURE OF HELIUM NOT ALLOWED!");
exit(1);
}
if (ar + ibutane > 100)
{
Error("HMdcGarMacroMaker:setFileNameOut()","GAX MIXTURE EXCEEDS 100%!");
exit(1);
}
argon = ar;
}
void HMdcGarMacroMaker::setHelium(Int_t he)
{
if (argon > 0)
{
Error("HMdcGarMacroMaker:setArgon()","ADMIXTURE OF ARGON NOT ALLOWED!");
exit(1);
}
if (he + ibutane > 100)
{
Error("HMdcGarMacroMaker:setFileNameOut()","GAX MIXTURE EXCEEDS 100%!");
exit(1);
}
helium = he;
}
void HMdcGarMacroMaker::setIButane(Int_t b)
{
if ((helium ? helium : argon) + ibutane > 100)
{
Error("HMdcGarMacroMaker:setFileNameOut()","GAX MIXTURE EXCEEDS 100%!");
exit(1);
}
ibutane = b;
}
void HMdcGarMacroMaker::setFileNameOut(TString myfile)
{
// Sets ascii output of HMdcGarMacroMaker
fNameAsciiOut=myfile;
if(fNameAsciiOut.CompareTo("")==0)
{
Error("HMdcGarMacroMaker:setFileNameOut()","NO OUTPUT FILE SEPCIFIED!");
exit(1);
};
cout<<"HMdcGarMacroMaker::setFileNameOut(): OUTPUT FILE= "<<fNameAsciiOut.Data()<<endl;
}
void HMdcGarMacroMaker::setFileNameSignals(TString myfile)
{
// Sets ascii output of HMdcGarMacroMaker
fNameSignalOut=myfile;
if(fNameSignalOut.CompareTo("")==0)
{
Error("HMdcGarMacroMaker:setFileNameSignals()","NO OUTPUT FILE SEPCIFIED!");
exit(1);
};
cout<<"HMdcGarMacroMaker::setFileNameSignals(): OUTPUT FILE= "<<fNameSignalOut.Data()<<endl;
}
void HMdcGarMacroMaker::setFileNameGasFile(TString myfile)
{
// Sets ascii output of HMdcGarMacroMaker
fNameGasIn=myfile;
if(fNameGasIn.CompareTo("")==0)
{
Error("HMdcGarMacroMaker:setFileNameGasFile()","NO OUTPUT FILE SEPCIFIED!");
exit(1);
};
cout<<"HMdcGarMacroMaker::setFileNameGasFile(): OUTPUT FILE= "<<fNameGasIn.Data()<<endl;
}
void HMdcGarMacroMaker::setPsFileName(TString myfile)
{
// Sets ascii output of HMdcGarMacroMaker
if(myfile.CompareTo("")==0)
{
Warning("HMdcGarMacroMaker:setPsFileName()","NO OUTPUT PSFILE SPECIFIED, FILE WILL BE TRACK.PS!");
}
else
{
postscriptfile=myfile;
}
postscript=kTRUE;
}
void HMdcGarMacroMaker::setPrintSetup(TString myset)
{
if(myset.CompareTo("")==0)
{
Error("HMdcGarMacroMaker::setPrintSetup()","NO PRINT SETUP SPECIFIED!");
exit(1);
}
parseArguments(myset);
}
void HMdcGarMacroMaker::setBFieldComponents(Float_t bx,Float_t by,Float_t bz)
{
B_components[0]=bx;
B_components[1]=by;
B_components[2]=bz;
}
void HMdcGarMacroMaker::parseArguments(TString s1)
{
// The option string is searched for known arguments and
// the internal variables of the class are defined according
// to the arguments.
// If unknown arguments are found error messages will be displayed
// and the program will be exited.
// Not found options will be switched to kFALSE.
// switch print key words
TString scell ="cell";
TString soption ="option";
TString sgas ="gas";
TString sfield ="field";
TString sdrift ="drift";
TString ssignal ="signal";
TString s3d ="3d";
Int_t icell =0;
Int_t ioption =0;
Int_t igas =0;
Int_t ifield =0;
Int_t idrift =0;
Int_t isignal =0;
Int_t i3d =0;
TString s2=s1; // make copy of string
s1.ToLower();
s1.ReplaceAll(" ","");
Ssiz_t len=s1.Length();
if(len!=0)
{
char* mystring=(char*)s1.Data();
Char_t* buffer;
TList myarguments;
TObjString *stemp;
TString argument;
Int_t count=0;
while(1) // find all token in option string and put them to a list
{
if(count==0)
{
buffer=strtok(mystring,",");
stemp=new TObjString(buffer);
myarguments.Add(stemp);
}
if(!(buffer=strtok(NULL,",")))break;
stemp=new TObjString(buffer);
myarguments.Add(stemp);
count++;
}
TIterator* myiter=myarguments.MakeIterator();
// iterate over the lis of arguments and compare the
// to known key words.
while ((stemp=(TObjString*)myiter->Next())!= 0)
{
argument=stemp->GetString();
if(argument.CompareTo(scell)==0)
{
icell++;
if(icell>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printcell=kTRUE;
}
else if(argument.CompareTo(soption)==0)
{
ioption++;
if(ioption>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printoption=kTRUE;
}
else if(argument.CompareTo(sgas)==0)
{
igas++;
if(igas>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printgas=kTRUE;
}
else if(argument.CompareTo(sfield)==0)
{
ifield++;
if(ifield>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printfield=kTRUE;
}
else if(argument.CompareTo(sdrift)==0)
{
idrift++;
if(idrift>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printdrift=kTRUE;
}
else if(argument.CompareTo(ssignal)==0)
{
isignal++;
if(isignal>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
printsignal=kTRUE;
}
else if(argument.CompareTo(s3d)==0)
{
i3d++;
if(i3d>1)
{
Error("HMdcGarMacroMaker:parseArguments()","Multiple appearence of same arguent!");
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
print3d=kTRUE;
}
else
{
Error("HMdcGarMacroMaker:parseArguments()","n unknown argument %s !",argument.Data());
cout<<"INPUT SETUPSTRING: "<<s2<<endl;
printKeyWords();
exit(1);
}
}
}
if(icell==0) printcell=kFALSE;
if(ioption==0)printoption=kFALSE;
if(igas==0) printgas=kFALSE;
if(ifield==0) printfield=kFALSE;
if(idrift==0) printdrift=kFALSE;
if(isignal==0)printsignal=kFALSE;
if(i3d==0) print3d=kFALSE;
}
void HMdcGarMacroMaker::initVariables()
{
// inits all variables
fNameAsciiOut ="";
fNameSignalOut ="";
fNameGasIn ="";
output =0;
postscript =kFALSE; // print pictures to ps
postscriptfile ="Track.ps"; // file name of ps output file
mdc =0;
temperature =293;
pressure =760;
helium =0;
argon =0;
ibutane =0;
mobility =1;
avalanche =44130;
collisions =500;
particle ="electron";
energy =0.7;
range =100;
timebin =0.001;
nTimeBin =1000;
angleDeg =0;
angleStep =0;
angleStepSize =5.;
nSignals =100;
writeData =kFALSE;
isochrones =0.005;
nLines =100;
printclusters=kFALSE;
printcell =kTRUE;
printoption =kTRUE;
printgas =kTRUE;
printfield =kTRUE;
printdrift =kTRUE;
printsignal =kTRUE;
print3d =kTRUE;
cathode_foils=kFALSE;
}
void HMdcGarMacroMaker::printKeyWords()
{
// Prints the known keywords to the screen
printf ("--------------------------------------------------------------------------------------------n");
printf ("HMdcGarMacroMaker::setPrintSetup() OPTIONS: cell, option, gas, field, drift, signal, 3dn");
}
void HMdcGarMacroMaker::printStatus(void)
{
// prints the parameters to the screen
printKeyWords();
printf ("--------------------------------------------------------------------------------------------n");
printf ("HMdcGarMacroMaker:n");
printf ("Print Setup: = ");
if(printcell) printf ("cell");
if(printoption)printf (", option");
if(printgas) printf (", gas");
if(printfield) printf (", field");
if(printdrift) printf (", drift");
if(printsignal)printf (", signal");
if(print3d) printf (", 3d");
printf ("n");
printf ("Macro output file = %sn",fNameAsciiOut.Data());
if(postscript)printf ("PS output file =%sn",postscriptfile.Data());
printf ("MDC TYPE = %in",mdc);
printf ("Impact angle = %3.1f degreen",angleDeg);
if(cathode_foils)
{
printf ("Cathod foils are usedn");
}
if(!cathode_foils)
{
printf ("Cathod wires are usedn");
}
printf ("HV cathods = %i V (GSI), %i V (DUBNA), %i V (FZR), %i V (ORRSAY),n"
,cathodhv[0],cathodhv[1],cathodhv[2],cathodhv[3]);
printf ("HV field = %i V (GSI), %i V (DUBNA), %i V (FZR), %i V (ORRSAY),n"
,fieldhv[0] ,fieldhv[1] ,fieldhv[2] ,fieldhv[3]);
printf ("HV sense = %i V (GSI), %i V (DUBNA), %i V (FZR), %i V (ORRSAY),n"
,sensehv[0] ,sensehv[1] ,sensehv[2] ,sensehv[3]);
if (argon > 0)
{
printf ("Gasmixture = Ar/i-Butane(%i/%i), temperature %i K, pressure %i torrn"
,argon,ibutane,temperature,pressure);
}
else
{
printf ("Gasmixture = He/i-Butane(%i/%i), temperature %i K, pressure %i torrn"
,helium,ibutane,temperature,pressure);
}
printf ("Track Conditions = %s, energy %3.2f GeV,n
avalanche %i, range %i mm, collisions %in"
,particle.Data(),energy,avalanche,range,collisions);
printf ("Signals = %i Signals per point, %5.3f ns timebinn",nSignals,timebin);
printf ("Dataset flag = %in",writeData);
printf ("Isochrones = %5.3f, nLines= %in",isochrones,nLines);
printf ("--------------------------------------------------------------------------------------------n");
}
void HMdcGarMacroMaker::putOut(Char_t* buffer)
{
// Prints the buffer to the screen and to the ascii output file
printf(buffer);
if(output)fprintf(output,"%s",buffer);
}
void HMdcGarMacroMaker::openOutPut()
{
// Opens the output file
if(fNameAsciiOut.CompareTo("")!=0)
{
output=fopen(fNameAsciiOut.Data(),"w");
}
else
{
Error("HMdcGarMacroMaker::openOutPut()","NO OUTPUT SPECIFIED!");
exit(1);
}
}
void HMdcGarMacroMaker::closeOutPut()
{
// Close the output file
if(output)fclose(output);
}
void HMdcGarMacroMaker::printMacro()
{
// Print the macro to the screen and the ascii file output
printStatus();
openOutPut();
printMetaHeader();
printCell();
printOptions();
printGeometry();
printField();
printMagnetic();
printGas();
printDrift();
printSignal();
print3D();
printMetaTrailer();
closeOutPut();
}
void HMdcGarMacroMaker::printMetaHeader()
{
// Prints the Metafile Header of the macro
if(postscript)
{
Char_t buffer[2048];
sprintf(buffer,"*****************HEADER*********************n"); putOut(buffer);
sprintf(buffer,"!opt linear-xn"); putOut(buffer);
sprintf(buffer,"!add meta type PostScript file-name "%s"n"
,postscriptfile.Data()); putOut(buffer);
sprintf(buffer,"!open metan"); putOut(buffer);
sprintf(buffer,"!act metan"); putOut(buffer);
sprintf(buffer,"!reset-coloursn"); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printCell()
{
// Prints the cell Id
if(printcell)
{
Char_t buffer[2048];
sprintf(buffer,"*****************CELL***********************n"); putOut(buffer);
sprintf(buffer,"&celln"); putOut(buffer);
sprintf(buffer,"cell-id "+=cathode,x=potential,o=sense"n"); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printOptions()
{
// Print some options
if(printoption)
{
Char_t buffer[2048];
sprintf(buffer,"*****************OPTIONS********************n"); putOut(buffer);
sprintf(buffer,"reset planesn"); putOut(buffer);
sprintf(buffer,"reset rowsn"); putOut(buffer);
if(printclusters||postscript)
{
sprintf(buffer,"opt layoutn"); putOut(buffer);
sprintf(buffer,"opt wire-markersn"); putOut(buffer);
sprintf(buffer,"opt cell-printn"); putOut(buffer);
}
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printGeometry()
{
// Print the Geometry of the drift cell
Char_t buffer[2048];
sprintf(buffer,"*****************GEOMETRY*******************n"); putOut(buffer);
if(!cathode_foils)
{ // if cathode wires are used
sprintf(buffer,"ROWSn"); putOut(buffer);
sprintf(buffer,"*label wire# thickness pitch x y voltage MDC%in"
,mdc); putOut(buffer);
sprintf(buffer,"c %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
ncathod[mdc],cathodth[mdc],cathodpitch[mdc],cathodx[mdc]
, 3*dc_s[mdc],cathodhvmod[0]==0? cathodhv[mdc]:cathodhvmod[0]); putOut(buffer);
sprintf(buffer,"p %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nfield[mdc] ,fieldth[mdc] ,fieldpitch[mdc] ,fieldx[mdc]
, 2*dc_s[mdc],fieldhvmod[0]==0? fieldhv[mdc]:fieldhvmod[0]); putOut(buffer);
sprintf(buffer,"S %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nsense[mdc] ,senseth[mdc] ,sensepitch[mdc] ,sensex[mdc]
, 2*dc_s[mdc],sensehvmod[0]==0? sensehv[mdc]:sensehvmod[0]); putOut(buffer);
sprintf(buffer,"c %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
ncathod[mdc],cathodth[mdc],cathodpitch[mdc],cathodx[mdc]
,-1*dc_s[mdc],cathodhvmod[1]==0? cathodhv[mdc]:cathodhvmod[1]); putOut(buffer);
sprintf(buffer,"c %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
ncathod[mdc],cathodth[mdc],cathodpitch[mdc],cathodx[mdc]
, 1*dc_s[mdc],cathodhvmod[2]==0? cathodhv[mdc]:cathodhvmod[2]); putOut(buffer);
sprintf(buffer,"p %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nfield[mdc] ,fieldth[mdc] ,fieldpitch[mdc] ,fieldx[mdc]
, 0*dc_s[mdc],fieldhvmod[1]==0? fieldhv[mdc]:fieldhvmod[1]); putOut(buffer);
sprintf(buffer,"S %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nsense[mdc] ,senseth[mdc] ,sensepitch[mdc] ,sensex[mdc]
, 0*dc_s[mdc],sensehvmod[1]==0? sensehv[mdc]:sensehvmod[1]); putOut(buffer);
sprintf(buffer,"c %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
ncathod[mdc],cathodth[mdc],cathodpitch[mdc],cathodx[mdc]
,-3*dc_s[mdc],cathodhvmod[3]==0? cathodhv[mdc]:cathodhvmod[3]); putOut(buffer);
sprintf(buffer,"p %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nfield[mdc] ,fieldth[mdc] ,fieldpitch[mdc] ,fieldx[mdc]
,-2*dc_s[mdc],fieldhvmod[2]==0? fieldhv[mdc]:fieldhvmod[2]); putOut(buffer);
sprintf(buffer,"S %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nsense[mdc] ,senseth[mdc] ,sensepitch[mdc] ,sensex[mdc]
,-2*dc_s[mdc],sensehvmod[2]==0? sensehv[mdc]:sensehvmod[2]); putOut(buffer);
}
else
{ // if cathode foils are used
sprintf(buffer,"plane y=%5.2f ,V=%5in",
-1*dc_s[mdc],cathodhvmod[2]==0? cathodhv[mdc]:cathodhvmod[2]); putOut(buffer);
sprintf(buffer,"plane y=%5.2f ,V=%5in",
1*dc_s[mdc],cathodhvmod[2]==0? cathodhv[mdc]:cathodhvmod[2]); putOut(buffer);
sprintf(buffer,"ROWSn"); putOut(buffer);
sprintf(buffer,"*label wire# thickness pitch x y voltage MDC%in"
,mdc); putOut(buffer);
sprintf(buffer,"p %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nfield[mdc] ,fieldth[mdc] ,fieldpitch[mdc] ,fieldx[mdc]
, 0*dc_s[mdc],fieldhvmod[1]==0? fieldhv[mdc]:fieldhvmod[1]); putOut(buffer);
sprintf(buffer,"S %2i %4.3f (%3.2f*I)-%3.2f %5.2f %5in",
nsense[mdc] ,senseth[mdc] ,sensepitch[mdc] ,sensex[mdc]
, 0*dc_s[mdc],sensehvmod[1]==0? sensehv[mdc]:sensehvmod[1]); putOut(buffer);
}
sprintf(buffer,"n"); putOut(buffer);
}
void HMdcGarMacroMaker::printField()
{
// Print the field section of the macro
if(printfield)
{
Char_t buffer[2048];
sprintf(buffer,"*****************FIELD**********************n"); putOut(buffer);
sprintf(buffer,"&fieldn"); putOut(buffer);
sprintf(buffer,"track FROM 0. 1. TO 0. -1.n"); putOut(buffer);
sprintf(buffer,"grid 40 40n"); putOut(buffer);
sprintf(buffer,"*xmin ymin xmax ymaxn"); putOut(buffer);
if(postscript)
{
if(mdc==0){sprintf(buffer,"area -0.32 -0.27 0.32 0.27n"); putOut(buffer);}
if(mdc==1){sprintf(buffer,"area -0.32 -0.28 0.32 0.28n"); putOut(buffer);}
if(mdc==2){sprintf(buffer,"area -0.62 -0.42 0.62 0.42n"); putOut(buffer);}
if(mdc==3){sprintf(buffer,"area -0.82 -0.62 0.82 0.62n"); putOut(buffer);}
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"plot contour e N 50 NOLABELn"); putOut(buffer);
sprintf(buffer,"plot contour v N 50 NOLABELn"); putOut(buffer);
sprintf(buffer,"plot surface en"); putOut(buffer);
sprintf(buffer,"plot graph en"); putOut(buffer);
sprintf(buffer,"plot graph vn"); putOut(buffer);
if(writeData)
{
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"> graph_e_mdc%i.datn",mdc); putOut(buffer);
sprintf(buffer,"plot graph e N 200 printn"); putOut(buffer);
sprintf(buffer,">n"); putOut(buffer);
}
}
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printMagnetic()
{
// Prints the magnetic field settings
if(printcell)
{
Char_t buffer[2048];
sprintf(buffer,"*****************MAGNETIC*******************n"); putOut(buffer);
sprintf(buffer,"&magneticn"); putOut(buffer);
sprintf(buffer,"components %5.2f %5.2f %5.2f T n",
B_components[0],B_components[1],B_components[2]); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printGas()
{
// Print the Gas section of the macro
if(printgas)
{
Char_t name[300];
if (argon > 0)
{
sprintf(name,"ar%i-%i-%i-%i.dat",argon,ibutane,temperature,pressure);
}
else
{
sprintf(name,"he%i-%i-%i-%i.dat",helium,ibutane,temperature,pressure);
}
if(fNameGasIn.CompareTo("")==0)fNameGasIn=name;
Char_t buffer[2048];
sprintf(buffer,"*****************GAS************************n"); putOut(buffer);
sprintf(buffer,"&gasn"); putOut(buffer);
if (argon > 0)
{
sprintf(buffer,"gas-id "ar/iso-butane %i/%i"n"
,argon,ibutane); putOut(buffer);
}
else
{
sprintf(buffer,"gas-id "he/iso-butane %i/%i"n"
,helium,ibutane); putOut(buffer);
}
sprintf(buffer,"global gas_file `%s`n"
,fNameGasIn.Data()); putOut(buffer);
sprintf(buffer,"temperature %in"
,temperature); putOut(buffer);
sprintf(buffer,"pressure %in"
,pressure); putOut(buffer);
sprintf(buffer,"Call inquire_file(gas_file,exist)n"); putOut(buffer);
sprintf(buffer,"If exist Thenn"); putOut(buffer);
sprintf(buffer,"Say "Gas file exists, retrieving ..."n"); putOut(buffer);
sprintf(buffer,"get {gas_file}n"); putOut(buffer);
sprintf(buffer,"Elsen"); putOut(buffer);
sprintf(buffer,"Say "Gas file not found, generating ..."n"); putOut(buffer);
if (argon > 0)
{
sprintf(buffer,"magboltz argon %i. isobutane %i. mobility %fn"
,argon,ibutane,mobility); putOut(buffer);
sprintf(buffer,"write dataset "%s" gasdata remark "magboltz-ar%i-ibutane%i"n"
,fNameGasIn.Data(),argon,ibutane); putOut(buffer);
sprintf(buffer,"Endifn"); putOut(buffer);
sprintf(buffer,"heed argon %i. isobutane %i.n"
,argon,ibutane); putOut(buffer);
}
else
{
sprintf(buffer,"magboltz helium-4 %i. isobutane %i. mobility %fn"
,helium,ibutane,mobility); putOut(buffer);
sprintf(buffer,"write dataset "%s" gasdata remark "magboltz-he%i-ibutane%i"n"
,fNameGasIn.Data(),helium,ibutane); putOut(buffer);
sprintf(buffer,"Endifn"); putOut(buffer);
sprintf(buffer,"heed helium-4 %i. isobutane %i.n"
,helium,ibutane); putOut(buffer);
}
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printDrift()
{
// Print the Drift section of the macro
if(printdrift)
{
Char_t buffer[2048];
sprintf(buffer,"*****************DRIFT**********************n"); putOut(buffer);
sprintf(buffer,"&driftn"); putOut(buffer);
if(!cathode_foils)
{
sprintf(buffer,"SEL %in"
,cwire[mdc]); putOut(buffer);
}
if(cathode_foils)
{
sprintf(buffer,"SEL %in"
,cwire_foil[mdc]); putOut(buffer);
}
if(postscript)
{
if(mdc==0){sprintf(buffer,"area -0.32 -0.27 0.32 0.27n"); putOut(buffer);}
if(mdc==1){sprintf(buffer,"area -0.32 -0.28 0.32 0.28n"); putOut(buffer);}
if(mdc==2){sprintf(buffer,"area -0.62 -0.42 0.62 0.42n"); putOut(buffer);}
if(mdc==3){sprintf(buffer,"area -0.82 -0.62 0.82 0.62n"); putOut(buffer);}
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"plot contour VD N 50 NOLABELn"); putOut(buffer);
sprintf(buffer,"plot surface VD n"); putOut(buffer);
sprintf(buffer,"xt-plotn"); putOut(buffer);
if(writeData)
{
sprintf(buffer,"xt-plot DATASET "xtmdc%i.dat" REMARK "xt" n",
mdc); putOut(buffer);
}
sprintf(buffer,"DRIFT WIRES ANGLES 0 360 LINES %i ISOCHRONES= %5.3fn"
,nLines,isochrones); putOut(buffer);
if(writeData)
{
sprintf(buffer,"WRITE-ISOCHRONES DATASET "VDmdc%i.dat" contVD remark "isochrones mdc%i" n",
mdc,mdc); putOut(buffer);
}
sprintf(buffer,"*************Driftvelocity vs E/P***********n"); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"Call get_gas_data(p,t,id)n"); putOut(buffer);
sprintf(buffer,"Call get_E/p_table(ep)n"); putOut(buffer);
sprintf(buffer,"Call drift_velocity(0,0,ep*p,drift)n"); putOut(buffer);
sprintf(buffer,"!opt log-xn"); putOut(buffer);
sprintf(buffer,"Call plot_graph(ep,drift,`E/p [kV/cm bar]`,`Drift velocity [cm/microsec]`,`Drift velocity vs E/p`)n"); putOut(buffer);
sprintf(buffer,"Call plot_markers(ep,drift,`function-1`)n"); putOut(buffer);
sprintf(buffer,"Call plot_comment(`up-left`,`Magboltz: `/id)n"); putOut(buffer);
sprintf(buffer,"Call plot_end n"); putOut(buffer);
sprintf(buffer,"!opt linear-x n"); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
}
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printSignal()
{
// Print the Signal section of the macro
if(printsignal)
{
if(fNameSignalOut.CompareTo("")==0)
{
Char_t nameout[300];
sprintf(nameout,"/tmp/s%i-mdc%i.txt",(Int_t)angleDeg,mdc);
fNameSignalOut=nameout;
}
Char_t buffer[2048];
sprintf(buffer,"*****************SIGNAL*********************n"); putOut(buffer);
sprintf(buffer,"&signaln"); putOut(buffer);
sprintf(buffer,"*Track starting from left siden"); putOut(buffer);
sprintf(buffer,"area %5.2f %5.2f %5.2f %5.2fn",
area[mdc][0],area[mdc][1],area[mdc][2],area[mdc][3]); putOut(buffer);
if(!cathode_foils)
{
sprintf(buffer,"SELECT %in"
,cwire[mdc]);
putOut(buffer);
}
if(cathode_foils)
{
sprintf(buffer,"SELECT %in"
,cwire_foil[mdc]);
putOut(buffer);
}
sprintf(buffer,"AVALANCHE fixed %in"
,avalanche); putOut(buffer);
sprintf(buffer,"INTEGRATION-PARAMETERS MONTE-CARLO-COLLISIONS %in"
,collisions); putOut(buffer);
if(!printclusters)
{
sprintf(buffer,"OPTIONS NOCLUSTER-PLOT NOCLUSTER-PRINTn"); putOut(buffer);
}
sprintf(buffer,"****************Loop over distance**********n"); putOut(buffer);
sprintf(buffer,"For j From %i To %i Don"
,minLoop[mdc][angleStep]+1
,maxLoop[mdc][angleStep]); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"Global r= 0.01*jn"); putOut(buffer);
sprintf(buffer,"Global alphaDEG=%3.1fn"
,angleDeg); putOut(buffer);
sprintf(buffer,"Global alphaRAD=pi/180.*alphaDEGn"); putOut(buffer);
sprintf(buffer,"Global dx=0.1n"); putOut(buffer);
sprintf(buffer,"Global dy=dx*tan(pi/2.+alphaRAD)n"); putOut(buffer);
sprintf(buffer,"Global x1=r*cos(alphaRAD)n"); putOut(buffer);
sprintf(buffer,"Global y1=r*sin(alphaRAD)n"); putOut(buffer);
sprintf(buffer,"Global x=(%5.2f-(y1-x1*tan(pi/2.+alphaRAD)))/tan(pi/2.+alphaRAD)n"
,dc_s[mdc]); putOut(buffer);
sprintf(buffer,"Global y= %5.2fn"
,dc_s[mdc]); putOut(buffer);
sprintf(buffer,"TRACK FROM {x} {y} DIRECTION {dx} {dy} RANGE %i %s energy %5.2f GeVn"
,range,particle.Data(),energy); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"TIME-WINDOW %3.1f %5.3f %in"
,time_low[mdc],timebin,nTimeBin); putOut(buffer);
sprintf(buffer,"****************Loop over signal************n"); putOut(buffer);
sprintf(buffer,"For i From 1 To %i Don"
,nSignals); putOut(buffer);
sprintf(buffer,"SIGNAL AVALANCHE NOELECTRON-PULSE ION-TAIL MONTE-CARLO-DRIFT-LINESn");
putOut(buffer);
sprintf(buffer,"WRITE-SIGNALS DATASET "%s" REMARK "signals %i degree impact" UNITS NANO-SECONDn",
fNameSignalOut.Data(),(Int_t)angleDeg); putOut(buffer);
if(postscript)
{
if(!cathode_foils)
{
sprintf(buffer,"PLOT-SIGNALS TIME-WINDOW %3.1f %3.1f WIRE %in"
,time_low[mdc],time_up[mdc],cwire[mdc]);
putOut(buffer);
}
if(cathode_foils)
{
sprintf(buffer,"PLOT-SIGNALS TIME-WINDOW %3.1f %3.1f WIRE %in"
,time_low[mdc],time_up[mdc],cwire_foil[mdc]);
putOut(buffer);
}
}
sprintf(buffer,"enddon"); putOut(buffer);
sprintf(buffer,"****************End Loop over signal*********n"); putOut(buffer);
sprintf(buffer,"enddon"); putOut(buffer);
sprintf(buffer,"****************End Loop over distance*******n"); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::printMetaTrailer()
{
// Print the Metafiel Trailer of the macro
if(postscript)
{
Char_t buffer[2048];
sprintf(buffer,"*****************TRAILER*********************n"); putOut(buffer);
sprintf(buffer,"!deact metan"); putOut(buffer);
sprintf(buffer,"!close metan"); putOut(buffer);
sprintf(buffer,"!del metan"); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
void HMdcGarMacroMaker::print3D()
{
// Print some 3d plot of the drift cell
if(print3d)
{
Char_t buffer[2048];
sprintf(buffer,"*****************3D*************************n"); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"* cathodsn"); putOut(buffer);
sprintf(buffer,"solidsn"); putOut(buffer);
sprintf(buffer,"For x From -%5.3f Step %5.3f To %5.3f Don"
,cathodx[mdc],cathodpitch[mdc],ncathod[mdc]*cathodpitch[mdc]); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 0 0 1 conductor-1n"
, 3*dc_s[mdc],0.5*cathodth[mdc]); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 0 0 1 conductor-1n"
, 1*dc_s[mdc],0.5*cathodth[mdc]); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 0 0 1 conductor-1n"
,-1*dc_s[mdc],0.5*cathodth[mdc]); putOut(buffer);
sprintf(buffer,"Enddon"); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"* potential ordered -20,-40n"); putOut(buffer);
sprintf(buffer,"solidsn"); putOut(buffer);
sprintf(buffer,"For x From -%5.3f Step %5.3f To %5.3f Don"
,fieldx[mdc],fieldpitch[mdc],nfield[mdc]*fieldpitch[mdc]); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 1 0 -%f conductor-2n"
, 2*dc_s[mdc],0.5*fieldth[mdc],tan((90-20)*TMath::Pi()/180)); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 1 0 -%f conductor-2n"
, 0*dc_s[mdc],0.5*fieldth[mdc],tan((90-40)*TMath::Pi()/180)); putOut(buffer);
sprintf(buffer,"Enddon"); putOut(buffer);
sprintf(buffer,"*-------------------------------------------n"); putOut(buffer);
sprintf(buffer,"*sense ordered -20,-40n"); putOut(buffer);
sprintf(buffer,"For x From -%5.3f Step %5.3f To %5.3f Don"
,sensex[mdc],sensepitch[mdc],nsense[mdc]*sensepitch[mdc]); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 1 0 -%f conductor-2n"
, 2*dc_s[mdc],0.5*senseth[mdc],tan((90-20)*TMath::Pi()/180)); putOut(buffer);
sprintf(buffer,"cylinder CENTRE {x} %5.2f 0 RADIUS %5.4f HALF-LENGTH 1 DIRECTION 1 0 -%f conductor-2n"
, 0*dc_s[mdc],0.5*senseth[mdc],tan((90-40)*TMath::Pi()/180)); putOut(buffer);
sprintf(buffer,"Enddon"); putOut(buffer);
sprintf(buffer,"n"); putOut(buffer);
}
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.